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

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

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

是否有一个原因? Uri.AbsoluteUri的文档指出它“获取绝对URI”, Uri.ToString() “获取指定实例的规范string表示forms”。

举个例子:

 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另一方面将返回编码的forms为HttpUtility.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 

因为每个人似乎都认为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();