作为对Azure问题的评论,@ smarx注意到
我认为做blob.Uri.AbsoluteUri通常比做更好 blob.Uri.ToString()。
这有什么理由吗? Uri.AbsoluteUri
的文档指出它“获取绝对URI”,Uri.ToString()
“获取指定实例的规范字符串表示。”
答案 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,包括所有片段和查询字符串。