В чем разница между Uri.ToString () и Uri.AbsoluteUri?


92

В качестве комментария к вопросу об Azure только что @smarx отметил

Я думаю, что вообще лучше делать blob.Uri.AbsoluteUri, чем blob.Uri.ToString ().

Есть причина для этого? В документации для Uri.AbsoluteUriзаметок, что он «Получает абсолютный URI», Uri.ToString()«Получает каноническое строковое представление для указанного экземпляра».


1
ToString делает URI более читабельным, но при этом декодирует многие символы в кодировке URLEncoded, что в некоторых случаях может вызвать проблемы. Поведение также различается между средами выполнения .NET Framework. Для сравнения см. 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.
— Брэдли Грейнджер,

1
Бывают случаи, когда вам действительно нужен ToString. Здесь, в SO, отличный пример (см. Мой ответ выше). Вы хотите «визуализировать» URL. Суть (всегда в программировании) - будьте осторожны и знайте, что делаете.
— Ofer Zelig

3
Обратите внимание, что приведенный здесь пример (и в code.logos.com/blog/2010/08/uritostring_must_die.html ) больше не актуален . Эти проблемы были исправлены в .NET Framework 4.5. Однако ToString () по-прежнему предназначен только для удобочитаемого (визуального) представления URL-адреса. Если вы скопируете этот URL-адрес в браузер, он все равно должен работать.
— arni

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.