Яка різниця між Uri.ToString () та Uri.AbsoluteUri?


92

Як коментар до запитання про Azure зараз, @smarx зазначив

Я думаю, що зазвичай краще робити blob.Uri.AbsoluteUri, ніж blob.Uri.ToString ().

Чи є для цього причина? Документація для Uri.AbsoluteUriзазначає, що він "Отримує абсолютний URI", Uri.ToString()"Отримує канонічне подання рядка для вказаного екземпляра."


1
ToString робить URI більш читабельним, але, роблячи це, він декодує багато символів, кодованих URLE, що в деяких випадках буде складним. Поведінка також відрізняється між час роботи середовища .net. Для порівняння див. Dhvik.blogspot.com/2019/12/… .
Ден,

Відповіді:


103

Дано для прикладу:

UriBuilder builder = new UriBuilder("http://somehost/somepath");
builder.Query = "somekey=" + HttpUtility.UrlEncode("some+value");
Uri someUri = builder.Uri;

У цьому випадку Uri.ToString()поверне зручну для читання URL-адресу: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri з іншого боку поверне закодовану форму як HttpUtility.UrlEncode повернув її: http://somehost/somepath?somekey=some%2bvalue


35
Але зауважте, що "читається людиною URL-адреса" (повернена з ToString), ймовірно, пошкоджена і майже ніколи не те, що вам потрібно: code.logos.com/blog/2010/08/uritostring_must_die.html . Я б уникав виклику ToString, коли це можливо.
Bradley Grainger

1
Бувають випадки, коли ви хочете отримати ToString. Ось у SO чудовий приклад (див. Мою відповідь вище). Ви хочете "візуалізувати" URL-адресу. Суть (завжди в програмуванні) полягає в тому, щоб бути обережним і знати, що ти робиш.
Ofer Zelig

3
Зверніть увагу, що приклади тут (і в code.logos.com/blog/2010/08/uritostring_must_die.html ) більше не є актуальними. Ці проблеми було виправлено у .NET Framework 4.5. Однак ToString () все ще призначений лише для читабельного (візуального) представлення URL-адреси. Якщо ви скопіюєте цю URL-адресу в браузер, вона все одно повинна працювати.
арні

1
Схоже, найкраще використовувати, OriginialStringніж ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen

31

Додатково: Якщо ваш Uriє родич Uri AbsoluteUri не зможе, ToString()немає.

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string str1 = uri.ToString(); // "fuu/bar.xyz"
string str2 = uri.AbsoluteUri; // InvalidOperationException

5

Оскільки всі, здається, вважають, що uri.AbsoluteUriце краще, але оскільки це не вдається із відносними шляхами, то, мабуть, універсальним був би такий спосіб:

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string notCorruptUri = Uri.EscapeUriString(uri.ToString());


0

Наступний приклад записує повний вміст екземпляра Uri на консоль. У наведеному прикладі

http://www.cartechnewz.com/catalog/shownew.htm?date=today

записується на консоль.

Uri baseUri = new Uri("http://www.cartechnewz.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm?date=today");
Console.WriteLine(myUri.AbsoluteUri);

Властивість AbsoluteUri включає весь URI, що зберігається в екземплярі Uri, включаючи всі фрагменти та рядки запитів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.