带有方括号的Uri.EscapeUriString
这是一个奇怪的问题,但让我们看看它得到了什么样的反应……
如果我编写控制台应用程序(VS 2013,.NET 4.5.1)并执行以下代码行:
Uri.EscapeUriString("[")
我明白了:
[
但是如果我在我的机器上的LINQPad中执行相同的操作(好吧,技术上是Uri.EscapeUriString("[").Dump()
),我得到这个:
%5B
为了进一步复杂化, 根据这篇文章, Uri.EscapeUriString("[")
确实应该返回%5B
。该post写于27/06/2012。
我想也许LINQPad引用的是比VS使用的更旧的DLL,但这意味着EscapeUriString
最近已经发生变化,我找不到任何记录。 有没有人对可能导致这种行为的原因有任何想法?
这在.Net 4和.Net 4.5之间发生了变化,您可以通过将框架版本重新定位到.Net 4并运行测试程序来validation。
.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.
特别是, EscapeUriString不会转义重要的保留字符 。
根据RFC 2396 ,新行为似乎是正确的。 在第566行,它指出:
566. Other characters are excluded because gateways and other transport 567. agents are known to sometimes modify such characters, or they are 568. used as delimiters. 569. 570. unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
在Uri.EscapeUriString的文档中,它说明了这一点
默认情况下,EscapeUriString方法将除RFC 2396非保留字符之外的所有字符转换为hex表示forms
因此,似乎在.NET 4.0中存在一个在4.5.1中修复的错误