2

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

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

4

3 回答 3

1

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

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

于 2012-04-25T17:54:14.337 回答
1

因为 URI 确实使用 url 编码

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

        System.Web.HttpUtility.UrlDecode("NY%26A");
        System.Web.HttpUtility.UrlEncode("NY&A");
于 2012-04-25T17:59:01.940 回答
0

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

于 2018-11-26T22:24:19.297 回答