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

Jer*_*Gee 86 .net c#

作为对Azure问题的评论,@ smarx指出

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

是否有一个原因?它的文档Uri.AbsoluteUri"获取绝对URI",Uri.ToString()"获取指定实例的规范字符串表示形式".

Ofe*_*lig 96

举个例子:

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

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

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

  • 但请注意,"人类可读的URL"(从ToString返回)可能已损坏,几乎不会是您想要的:http://code.logos.com/blog/2010/08/uritostring_must_die.html.我会尽可能避免调用ToString. (30认同)
  • 看起来最好使用 `OriginialString` 而不是 `ToString()` [https://docs.microsoft.com/en-us/dotnet/api/system.uri.originalstring?view=netframework-4.8#examples] (4认同)
  • 请注意,此处(以及http://code.logos.com/blog/2010/08/uritostring_must_die.html中)的示例不再是最新的..NET Framework 4.5中已修复这些问题.但是,ToString()仍然仅用于URL的人类可读(可视)表示.如果您将此URL复制到浏览器,它仍然可以工作. (3认同)

ord*_*dag 28

另外:如果你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
Run Code Online (Sandbox Code Playgroud)


Roh*_*ews 5

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

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : uri?.ToString();
Run Code Online (Sandbox Code Playgroud)