2012-04-03 32 views
6

如何阻止System.Uri類解除傳遞給其構造函數的編碼URL?考慮以下代碼: -如何阻止System.Uri解密URL?

Uri uri = new Uri("http://foo.bar/foo%2FBar"); 
Console.WriteLine(uri.AbsoluteUri); 
uri = new Uri("http://foo.bar/foo%2FBar", false); 
Console.WriteLine(uri.AbsoluteUri); 
uri = new Uri("http://foo.bar/foo%2FBar", true); 
Console.WriteLine(uri.AbsoluteUri); 

在每種情況下,輸出爲「http://foo.bar/foo/bar」。我如何確保在實例化Uri實例後,Uri.AbsoluteUri將返回「http://foo.bar/foo%2FBar」?

回答

4

Uri類不用於生成轉義的URI,儘管您可以使用uri.OriginalString來檢索用於初始化的字符串。如果您需要安全地重新編碼URI,則應該使用UrlEncode。

此外,根據http://msdn.microsoft.com/en-us/library/9zh9wcb3.aspx Uri初始值設定項中的參數dontEscape已被棄用,並且始終爲false。

UPDATE:

似乎有人發現了一種方法(黑客)要做到這一點 - 我已經使用以UrlEncode GETting a URL with an url-encoded slash

+0

。我的問題實際上是當試圖構建一個HttpWebRequest實例來進行一個REST調用,其中URL可能包含一個轉義字符(包括上面顯示的斜線)。我使用WebRequest.Create(UrlString)重載來創建請求,並發現傳遞給服務器的URL解密了編碼的斜槓,導致服務器端錯誤。進一步的測試表明,這可能是Uri類的問題,因此我的問題。 – Cleggy 2012-04-03 10:03:57

+0

查看鏈接更新 – PinnyM 2012-04-03 13:45:22

+0

感謝您的鏈接,PinnyM。由於它的「可怕的黑客」性質,我想知道我是否應該走這條路,或者完全採取另一個方案來解決我的問題。目前我正在嘗試調用REST服務,但我可以靈活地將其更改爲SOAP,這也應該可以緩解這個問題。儘管如此,你已經解決了這個問題,所以我打算把這個標記爲正確的答案。 – Cleggy 2012-04-03 20:15:26