背景:我正在尝试对 MVC 应用程序进行一些 URL 操作。我编写了一个 HtmlHelper 扩展方法,用另一个替换查询字符串值。该方法取当前请求字符串,手动拆分查询部分(以免 Foo=1&Foo=Hello%2c%20World!&Foo=2 被读取为 Foo=1,Hello, World,2),然后尝试使用 UriBuilder 和 Uri 获取 URL。
问题:由于某种原因,Uri.ToString 部分解码了查询字符串。作为一个快速测试,我启动了 LINQPad 并运行了以下命令:
var ub = new System.UriBuilder("http://foobar");
ub.Query = "NY%26A"; // NY&A
ub.Uri.Dump();
ub.Uri.ToString().Dump();
ub.Uri.Query.Dump();
ub.ToString().Dump();
结果是:
http://foobar/?NY&A
http://foobar/?NY&A
?NY%26A
http://foobar:80/?NY%26A
我说部分解码,因为如果我使用大量转义字符,它会解码一些并保留其他字符:
var ub = new System.UriBuilder("http://foobar");
ub.Query = "!%40%23%24%25%5E%26*()"; // !@#$%^&*()
ub.Uri.Dump();
ub.Uri.ToString().Dump();
ub.Uri.Query.Dump();
ub.ToString().Dump();
结果:
http://foobar/?!@%23$%25^&*()
http://foobar/?!@%23$%25^&*()
?!%40%23%24%25%5E%26*()
http://foobar:80/?!%40%23%24%25%5E%26*()
问题:有人可以解释发生了什么吗?