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();