2013-11-15 114 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中同一部分中列出的字符,這些字符是不同的。 –