2013-11-15 113 views
5

东西一个奇怪的问题,但让我们看看有什么样的反应它得到的...Uri.EscapeUriString用方括号

如果我编写一个控制台应用程序(VS 2013,.NET 4.5.1)和执行这条线代码:

Uri.EscapeUriString("[")

我得到这个:

[

但是如果我执行同样的事情(当然,从技术上Uri.EscapeUriString("[").Dump())在LINQPad我的机器上我得到这样的:

%5B

更复杂的是,according to this postUri.EscapeUriString("[")的确应该返回%5B .The后写在27/06/2012。

我在想,也许LINQPad引用的是比VS使用的更老的DLL,但这意味着EscapeUriString相对最近发生了变化,我找不到任何记录。有没有人有任何想法可以导致这种行为?

+0

WT?我可以在4.5.1中复制! –

回答

5

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

净4 - >输出 “%5B” .NET 4.5(或更高版本) - >输出 “[”

这是这里提到:Application Compatibility in the .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不逃脱保留字符这是显著。

2

根据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级毫无保留的人物,他们的十六进制表示

所以它似乎有一个bug最多.NET 4.0这是固定在4.5.1

+0

不正确。 .NET 4以上。0,遵循RFC 2396正确。没有转义的字符在第469行中列出,而不是570. dot Net 4.5.1实际上遵循RFC 3986中同一部分中列出的字符,这些字符是不同的。 –