C# 什么';Uri.ToString()和Uri.AbsoluteUri之间的区别是什么?

C# 什么';Uri.ToString()和Uri.AbsoluteUri之间的区别是什么?,c#,.net,C#,.net,@smarx指出,作为对刚才一个Azure问题的评论 我认为一般来说,使用blob.Uri.AbsoluteUri比使用blob.Uri.AbsoluteUri更好 blob.Uri.ToString() 这有什么原因吗?Uri.AbsoluteUri的文档说明它“获取绝对Uri”,Uri.ToString()“获取指定实例的规范字符串表示形式。”例如: UriBuilder builder = new UriBuilder("http://somehost/somepath"); builde

@smarx指出,作为对刚才一个Azure问题的评论

我认为一般来说,使用blob.Uri.AbsoluteUri比使用blob.Uri.AbsoluteUri更好 blob.Uri.ToString()

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

例如:

UriBuilder builder = new UriBuilder("http://somehost/somepath");
builder.Query = "somekey=" + HttpUtility.UrlEncode("some+value");
Uri someUri = builder.Uri;
在这种情况下,,
Uri.ToString()将返回一个人类可读的URL:

另一方面,
Uri.AbsoluteUri
将以HttpUtility.UrlEncode返回的形式返回编码表单:
http://somehost/somepath?somekey=some%2bvalue

另外:如果您的
Uri
相对的
Uri
绝对Uri
将失败,
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();

下面的示例将Uri实例的完整内容写入控制台。在所示的示例中

写入控制台

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,包括所有片段和查询字符串。

但请注意,“人类可读URL”(从ToString返回)可能已损坏,并且几乎从来都不是您想要的:。我会尽量避免打电话给ToString。有时候你确实想打电话给ToString。这里的SO是一个很好的例子(见我上面的答案)。您希望“可视化”URL。重点(总是在编程中)是-小心,知道你在做什么。注意这里(和中)的例子不再是最新的。这些问题已在.NET Framework 4.5中修复。但是,ToString()仍然仅用于URL的可读(可视)表示。如果您将此URL复制到浏览器,它应该仍然有效。看起来最好使用
OriginialString
而不是
ToString()
[ToString确实使URI更具可读性,但在执行此操作时,它会解码许多URL编码的字符,这在某些情况下会很麻烦。在.net framework的运行时之间,这种行为也不同。有关比较,请参阅。