Qual è la differenza tra Uri.ToString () e Uri.AbsoluteUri?


92

Come commento a una domanda su Azure proprio ora, ha notato @smarx

Penso che in genere sia meglio fare blob.Uri.AbsoluteUri che blob.Uri.ToString ().

C'è una ragione per questo? La documentazione per Uri.AbsoluteUriosserva che "Ottiene l'URI assoluto", Uri.ToString()"Ottiene una rappresentazione di stringa canonica per l'istanza specificata".


1
ToString rende l'URI più leggibile, ma mentre lo fa decodifica molti caratteri URLEncoded che in alcuni casi potrebbero creare problemi. Il comportamento è diverso anche tra i runtime del framework .net. Vedi dhvik.blogspot.com/2019/12/… per un confronto.
Dan

Risposte:


103

Dato ad esempio:

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

In questo caso, Uri.ToString()restituirà un URL leggibile dall'uomo: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri d'altra parte restituirà il modulo codificato come HttpUtility.UrlEncode lo ha restituito: http://somehost/somepath?somekey=some%2bvalue


35
Ma nota che l '"URL leggibile dall'uomo" (restituito da ToString) è probabilmente danneggiato e quasi mai quello che vuoi: code.logos.com/blog/2010/08/uritostring_must_die.html . Eviterei di chiamare ToString quando possibile.
Bradley Grainger

1
Ci sono volte in cui vuoi ToString. Qui in SO c'è un ottimo esempio (vedi la mia risposta sopra). Vuoi "visualizzare" l'URL. Il punto (sempre nella programmazione) è: stai attento e sappi cosa stai facendo.
Ofer Zelig

3
Nota che gli esempi qui (e in code.logos.com/blog/2010/08/uritostring_must_die.html ) non sono più attuali. Questi problemi sono stati risolti in .NET Framework 4.5. Tuttavia, ToString () è ancora inteso solo per la rappresentazione (visiva) leggibile dall'uomo dell'URL. Se copi questo URL nel browser, dovrebbe comunque funzionare.
arni

1
Sembra che sia meglio usare OriginialStringdi ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen

31

Inoltre: se il tuo Uriè un parente Uri AbsoluteUri fallirà, ToString()no.

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

5

Poiché tutti sembrano pensare che uri.AbsoluteUrisia meglio, ma poiché fallisce con percorsi relativi, allora probabilmente il modo universale sarebbe:

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

5

Perché non controllare e utilizzare quello corretto?

string GetUrl(Uri uri) => uri?.IsAbsoluteUri == true ? uri?.AbsoluteUri : uri?.ToString();

0

L'esempio seguente scrive il contenuto completo dell'istanza di Uri nella console. Nell'esempio mostrato,

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

viene scritto nella console.

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

La proprietà AbsoluteUri include l'intero URI archiviato nell'istanza di Uri, inclusi tutti i frammenti e le stringhe di query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.