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


92

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

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

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


1
ToString确实使URI更具可读性,但同时这样做会解码许多URLEncoded字符,这在某些情况下会很麻烦。.net框架的运行时之间的行为也有所不同。请参阅dhvik.blogspot.com/2019/12/…作为比较。

Answers:


103

例如:

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 另一方面将返回编码形式为HttpUtility.UrlEncode返回它: http://somehost/somepath?somekey=some%2bvalue


35
但是请注意,“人类可读的URL”(从ToString返回)可能已损坏,几乎永远不会破坏您想要的内容:code.logos.com/blog/2010/08/uritostring_must_die.html。我将尽可能避免调用ToString。
布拉德利·格兰杰

1
有时您确实想要ToString。因此,这是一个很好的示例(请参见上面的答案)。您要“可视化” URL。要点(始终在编程中)是-要小心,并知道自己在做什么。
Ofer Zelig 2012年

3
请注意,此处的示例(以及在code.logos.com/blog/2010/08/uritostring_must_die.html中)不再是当前示例。这些问题已在.NET Framework 4.5中修复。但是,ToString()仍然仅用于URL的人类可读(可视)表示。如果将此URL复制到浏览器,它将仍然有效。
arni

1
像它看起来是最好用OriginialStringToString()[ docs.microsoft.com/en-us/dotnet/api/...
karsnen

31

另外:如果您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

5

既然每个人似乎都认为这uri.AbsoluteUri更好,但是因为它在相对路径下失败了,所以通用的方法可能是:

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string notCorruptUri = Uri.EscapeUriString(uri.ToString());


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.