2016-03-07 48 views
1

下面的代碼...新的URI解碼相對路徑

string date = DateTime.UtcNow.ToString("o"); 
Console.WriteLine(date); 
string encodedDate = WebUtility.UrlEncode(date); 
Console.WriteLine(encodedDate); 
Uri uri = new Uri("https://mywebsite/"); 
Console.WriteLine(uri.ToString()); 
string relativePath = $"/mM0jpk613J5lzY00c3EaxQ%3D%3D/{encodedDate}"; 
Console.WriteLine(relativePath); 
uri = new Uri(uri, relativePath); 
Console.WriteLine(uri.ToString()); 

產生下面的輸出是: -

2016-03-07T08:17:38.5247330Z 
2016-03-07T08%3A17%3A38.5247330Z 
https://mywebsite/ 
/mM0jpk613J5lzY00c3EaxQ%3D%3D/2016-03-07T08%3A17%3A38.5247330Z 
https://mywebsite/mM0jpk613J5lzY00c3EaxQ%3D%3D/2016-03-07T08:17:38.5247330Z 

我期待的最後一行是

https://mywebsite/mM0jpk613J5lzY00c3EaxQ%3D%3D/2016-03-07T08%3A17%3A38.5247330Z

Uri爲什麼不能找到相對路徑?解決方法似乎是對相關路徑進行兩次編碼,但爲什麼?

是否有另一種方法,我應該用來創建此網址?

編輯:我更新了代碼以顯示更奇怪的行爲,相對uri的第一部分仍然編碼,但第二個不行!

+0

我已經登錄這是微軟的一個錯誤連接... https://connect.microsoft.com/VisualStudio/feedback/details/2444172 – Mick

+0

讓我們做,如果這是一個錯誤的數學。每天有多少開發者使用Uri類?我認爲很多! Uri自1.1 - 2003版以來一直使用.net?我認爲他們現在已經注意到了...... – Gusdor

+0

@Gusdor我很清楚Uri已經在框架中工作了多久。我會從2001年的第一個測試版(我使用過)說。如果你運行的代碼行爲不一致,那麼可能有什麼可能的邏輯解釋來解碼相對路徑的一半並將另一半編碼? – Mick

回答

2

URI是一個對象,它將以乾淨/未轉義的形式表示鏈接。如果您正在尋找以添加方式檢索它,請使用下面的屬性。

uri.OriginalString 
+0

是的,我仍然不理解邏輯,什麼是使用非轉義的URI?我認爲你的回答在編輯之前似乎更可以接受。這對我來說似乎是一個錯誤。你同意嗎? – Mick

+0

不是一個真正的錯誤,但同意有一個uri.EscapedString屬性可用。 – fozylet

+0

如何解釋正在解碼的relativePath字符串的一部分,而其他部分不是? – Mick