2017-05-04 85 views
6

在.Net 4.5之前,似乎System.Uri會對未編碼的斜槓進行unncode編碼,但這已經被修復了。參考:https://stackoverflow.com/a/20733619/188740System.Uri和編碼冒號(:)

我遇到了與冒號相同的問題。 System.Uri仍然解開已編碼的冒號。例如:

 var uri = new Uri("http://www.example.com/?foo=http%3A%2F%2Fwww.example.com"); 
     var s = uri.ToString(); //http://www.example.com/?foo=http:%2F%2Fwww.example.com 

通知%3A如何得到由的System.Uri切換回:。這是一個錯誤?什麼是最好的解決方法?

回答

4

如何使用Uri.AbsoluteUri代替?

var s = uri.AbsoluteUri; 
// http://www.example.com/?foo=http%3A%2F%2Fwww.example.com 

按照源,uri.ToString()看起來有邏輯反轉義某些部分由此可以看出here.AbsoluteUri具有簡單得多implementation

Uri.ToString()

作爲每MSDN文檔System.Uri.ToString()

包含Uri實例的轉義規範表示

String實例。除#,?和%以外的所有字符均未轉義。

但是按照該例子,嘗試了幾個字符串後,它看起來像實際執行somwhat像「只有:*spaces是轉義」

%3A (:) // gets unescaped 
%20 () // gets unescaped 
%2A (*) // gets unescaped 

%2b, %26, %23, %24, %25 (+, &, #, $, %) // Remain as-is (escaped) 

其它鏈接

+0

AbsoluteUri就像一個魅力。沒有AbsoluteUri,爲什麼冒號會得到未編碼?對我來說就像一個錯誤。 –

+1

是的,它看起來像。我相信這個錯誤是在某處[http://referencesource.microsoft.com/#System/net/System/URI.cs,1675],它會繼續前進,並會忽略某些部分。而'.AbsoluteUri'有一個更簡單的[實現](http://referencesource.microsoft.com/#System/net/System/URI.cs,738)。 – degant