Какая разница между 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();