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

时间:2011-10-02 06:41:40

标签: c# .net

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

  

我认为做blob.Uri.AbsoluteUri通常比做更好   blob.Uri.ToString()。

这有什么理由吗? Uri.AbsoluteUri的文档指出它“获取绝对URI”,Uri.ToString()“获取指定实例的规范字符串表示。”

5 个答案:

答案 0 :(得分:88)

举个例子:

UriBuilder builder = new UriBuilder("http://somehost/somepath");
builder.Query = "somekey=" + HttpUtility.UrlEncode("some+value");
Uri someUri = builder.Uri;

在这种情况下, Uri.ToString()将返回一个人类可读的网址:http://somehost/somepath?somekey=some+value

另一方面,

Uri.AbsoluteUri将返回编码形式为HttpUtility.UrlEncode返回它:http://somehost/somepath?somekey=some%2bvalue

答案 1 :(得分:25)

此外:如果您的Uri亲戚 Uri AbsoluteUri将失败,ToString()则不会。< / p>

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

由于每个人似乎认为uri.AbsoluteUri更好,但因为它失败了相对路径,那么可能通用的方式是:

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

答案 4 :(得分: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,包括所有片段和查询字符串。