Uri.ToString()和Uri.AbsoluteUri的区别是什么?

本文关键字:Uri 区别 是什么 ToString AbsoluteUri | 更新日期: 2023-09-27 18:10:09

作为刚才Azure问题的评论,@smarx注意到

我认为通常使用blob.Uri.AbsoluteUri比blob.Uri.ToString () .

这有什么原因吗?Uri.AbsoluteUri的文档指出它"获取绝对URI",Uri.ToString()"获取指定实例的规范字符串表示形式"。

Uri.ToString()和Uri.AbsoluteUri的区别是什么?

举例:

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将返回作为httutility的编码形式。UrlEncode返回它:http://somehost/somepath?somekey=some%2bvalue

另外:如果您的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

为什么不检查并使用正确的?

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

既然每个人似乎都认为uri.AbsoluteUri更好,但因为它在相对路径上失败了,那么可能通用的方法是:

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

下面的示例将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,包括所有片段和查询字符串。