Какая разница между Uri.ToString() и Uri.AbsoluteUri?

Как комментарий к вопросу Azure только сейчас, @smarx отметил

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

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

Ответ 1

Учитывая, например:

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

Ответ 2

Дополнительно: Если ваш 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

Ответ 3

Поскольку все, кажется, считают, что uri.AbsoluteUri лучше, но поскольку он терпит неудачу с относительными путями, то, вероятно, универсальный способ:

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

Ответ 4

Почему бы не проверить и не использовать правильный?

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : uri?.ToString();