В чем разница между Uri.ToString () и Uri.Абсолютная правда?


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

Я думаю, что это вообще лучше делать шарик.Ури.Абсолютное превосходство клякса.Ури.ToString ().

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

4 71

4 ответа:

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

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

дополнительно: если Uri это относительныеUriAbsoluteUri не будет выполнена, ToString() нет.

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

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

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

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

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