2016-03-07 4 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

Почему Ури игнорирует относительный путь? Кажется, что работа заключается в том, чтобы дважды закодировать относительный путь, но почему?

Есть ли альтернативный метод, который я должен использовать для создания этого URL-адреса?

EDIT: я обновил код, чтобы отобразить еще более странное поведение, первая часть относительного uri остается закодированной, а вторая - нет!

+0

Я вошел это как ошибка в Microsoft Connect ... https://connect.microsoft.com/VisualStudio/feedback/details/2444172 – Mick

+0

Позволяет делать математику на если это ошибка , Сколько разработчиков каждый день использует Uri? Много думаю! Ури был в .net с версии 1.1 - 2003 ish? Я думаю, они уже заметили бы ... – Gusdor

+0

@ Гусдор. Я хорошо знаю, как долго Ури находится в рамках. Я бы сказал, с первой бета-версии 2001 года (которую я использовал). Тем не менее, если вы запускаете код, он не ведет себя последовательно, какое возможное логическое объяснение может быть для него декодированием одной половины относительного пути и оставить вторую половину закодированной? – Mick

ответ

2

URI - это объект и будет представлять ссылку в ее чистой/неэкранированной форме. Если вы ищете его, как он был добавлен, используйте свойство ниже.

uri.OriginalString 
+0

Да, я все еще не понимаю логику, каково использование неэкранированного URI? Я думаю, что ваш ответ казался более приемлемым до моего редактирования. Мне это кажется ошибкой. Вы согласны? – Mick

+0

Не совсем ошибка, но согласитесь, что было бы полезно иметь доступное свойство uri.EscapedString. – fozylet

+0

Как вы объясняете часть строки relativePath, которая декодируется, а другая часть - нет? – Mick