Was ist der Unterschied zwischen Uri.ToString () und Uri.AbsoluteUri?

92

Als Kommentar zu einer Azure-Frage bemerkte @smarx gerade

Ich denke, es ist im Allgemeinen besser, blob.Uri.AbsoluteUri zu machen als blob.Uri.ToString ().

Gibt es einen Grund dafür? In der Dokumentation wird darauf Uri.AbsoluteUrihingewiesen, dass "der absolute URI abgerufen wird", Uri.ToString()"eine kanonische Zeichenfolgendarstellung für die angegebene Instanz abgerufen wird".

Jeremy McGee
quelle
1
ToString macht den URI zwar besser lesbar, dekodiert dabei jedoch viele URLEncodierte Zeichen, was in einigen Fällen problematisch sein wird. Das Verhalten unterscheidet sich auch zwischen den Laufzeiten des .net-Frameworks. Einen Vergleich finden Sie unter dhvik.blogspot.com/2019/12/… .
Dan

Antworten:

103

Zum Beispiel gegeben:

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

In diesem Fall Uri.ToString()wird eine für Menschen lesbare URL zurückgegeben: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri Auf der anderen Seite wird das codierte Formular als HttpUtility.UrlEncode zurückgegeben: http://somehost/somepath?somekey=some%2bvalue

Ofer Zelig
quelle
35
Beachten Sie jedoch, dass die "von Menschen lesbare URL" (von ToString zurückgegeben) wahrscheinlich beschädigt ist und fast nie das ist, was Sie wollen: code.logos.com/blog/2010/08/uritostring_must_die.html . Ich würde es nach Möglichkeit vermeiden, ToString anzurufen.
Bradley Grainger
1
Es gibt Zeiten, in denen Sie ToString möchten. Hier in SO ist ein gutes Beispiel (siehe meine Antwort oben). Sie möchten die URL "visualisieren". Der Punkt (immer in der Programmierung) ist - seien Sie vorsichtig und wissen Sie, was Sie tun.
Ofer Zelig
3
Beachten Sie, dass das Beispiel hier (und in code.logos.com/blog/2010/08/uritostring_must_die.html ) nicht mehr aktuell ist. Diese Probleme wurden in .NET Framework 4.5 behoben. ToString () ist jedoch immer noch nur für die lesbare (visuelle) Darstellung der URL gedacht. Wenn Sie diese URL in den Browser kopieren, sollte sie weiterhin funktionieren.
Arni
1
Sieht so aus, als wäre es am besten zu verwenden OriginialStringals ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen
31

Zusätzlich: Wenn Sie Uriein Verwandter sind, Uri AbsoluteUri schlägt dies fehl ToString().

Uri uri = new Uri("fuu/bar.xyz", UriKind.Relative);
string str1 = uri.ToString(); // "fuu/bar.xyz"
string str2 = uri.AbsoluteUri; // InvalidOperationException
ordag
quelle
5

Da jeder zu denken scheint, dass das uri.AbsoluteUribesser ist, aber weil es mit relativen Pfaden versagt, wäre der universelle Weg wahrscheinlich:

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

Warum nicht die richtige prüfen und verwenden?

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : uri?.ToString();
Rohit Vipin Mathews
quelle
0

Im folgenden Beispiel wird der gesamte Inhalt der Uri-Instanz in die Konsole geschrieben. In dem gezeigten Beispiel

http://www.cartechnewz.com/catalog/shownew.htm?date=today

wird in die Konsole geschrieben.

Uri baseUri = new Uri("http://www.cartechnewz.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm?date=today");
Console.WriteLine(myUri.AbsoluteUri);

Die AbsoluteUri-Eigenschaft enthält den gesamten in der Uri-Instanz gespeicherten URI, einschließlich aller Fragmente und Abfragezeichenfolgen.

AKMDD Ken
quelle