为什么Uri会部分解码查询部分?

时间:2012-04-25 17:49:06

标签: .net uri

背景:我正在尝试为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*()

问题:有人可以解释发生了什么吗?

3 个答案:

答案 0 :(得分:1)

似乎正在使用“安全”解码。在第二个示例中,它不会解码#或%,因为这会改变URI的结构/含义。

如果您不希望发生解码,请停止在URI上调用.ToString(),而是直接访问您想要的组件。

答案 1 :(得分:1)

因为URI确实使用了url encode

您可以使用它来读取原始内容或将编码值添加到URI对象:

        System.Web.HttpUtility.UrlDecode("NY%26A");
        System.Web.HttpUtility.UrlEncode("NY&A");

答案 2 :(得分:0)

如果Uri是由字符串构造的,则Uri.OriginalString是使用原始编码返回原始字符串的简便方法。