带有方括号的Uri.EscapeUriString

Lev*_*lho 8 c# uri escaping linqpad .net-4.5

一个奇怪的问题,但让我们看看它得到了什么样的反应......

如果我编写控制台应用程序(VS 2013,.NET 4.5.1)并执行以下代码行:

Uri.EscapeUriString("[")

我明白了:

[

但是如果我Uri.EscapeUriString("[").Dump()在我的机器上的LINQPad中执行相同的操作(好吧,技术上),我会得到:

%5B

为了使事情进一步复杂化,根据这篇文章 Uri.EscapeUriString("[")确实应该返回%5B.该帖子写于2012年6月27日.

我想也许LINQPad引用的是比VS使用的更旧的DLL,但这意味着EscapeUriString最近已经发生了变化,我无法找到任何记录.有没有人对可能导致这种行为的原因有任何想法?

Mat*_*son 5

这在.Net 4和.Net 4.5之间发生了变化,您可以通过将框架版本重新定位到.Net 4并运行测试程序来验证.

.Net 4 - >输出"%5B".net 4.5(或更高版本) - >输出"["

这里提到了:.NET Framework 4.5中的应用程序兼容性

Uri.EscapeDataString,Uri.EscapeUriString和Uri.UnescapeDataString的部分下,声明(使用.Net 4.5):

保留字符和未保留字符列表现在支持RFC 3986.

具体变化:

Unreserved escaped characters are un-escaped.
EscapeDataString escapes reserved characters based on RFC 3986.
EscapeUriString does not escape reserved characters.
UnescapeDataString does not throw an exception if it encounters an invalid escape sequence.
Run Code Online (Sandbox Code Playgroud)

特别是,EscapeUriString不会转义重要的保留字符.