Quelle est la différence entre Uri.ToString () et Uri.AbsoluteUri?

92

En commentaire à une question Azure à l'instant, @smarx a noté

Je pense qu'il est généralement préférable de faire blob.Uri.AbsoluteUri que blob.Uri.ToString ().

Y a-t-il une raison à cela? La documentation de Uri.AbsoluteUrinote qu'il "Obtient l'URI absolu", Uri.ToString()"Obtient une représentation sous forme de chaîne canonique pour l'instance spécifiée."

Jeremy McGee
la source
1
ToString rend l'URI plus lisible, mais ce faisant, il décode de nombreux caractères URLEncodés, ce qui sera gênant dans certains cas. Le comportement est également différent entre les environnements d'exécution du framework .net. Voir dhvik.blogspot.com/2019/12/… pour une comparaison.
Dan

Réponses:

103

Donné par exemple:

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

Dans ce cas, Uri.ToString()renvoie une URL lisible par l'homme: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri d'autre part retournera la forme encodée comme HttpUtility.UrlEncode l'a renvoyée: http://somehost/somepath?somekey=some%2bvalue

Ofer Zelig
la source
35
Mais notez que "l'URL lisible par l'homme" (renvoyée par ToString) est probablement corrompue et presque jamais ce que vous voulez: code.logos.com/blog/2010/08/uritostring_must_die.html . J'éviterais d'appeler ToString autant que possible.
Bradley Grainger le
1
Il y a des moments où vous voulez ToString. Voici dans SO est un excellent exemple (voir ma réponse ci-dessus). Vous souhaitez "visualiser" l'URL. Le point (toujours dans la programmation) est - soyez prudent et sachez ce que vous faites.
Ofer Zelig le
3
Notez que les exemples ici (et dans code.logos.com/blog/2010/08/uritostring_must_die.html ) ne sont plus à jour. Ces problèmes ont été résolus dans .NET Framework 4.5. Cependant, ToString () n'est toujours destiné qu'à la représentation lisible par l'homme (visuelle) de l'URL. Si vous copiez cette URL dans le navigateur, cela devrait toujours fonctionner.
arni
1
On dirait qu'il est préférable d'utiliser OriginialStringque ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen
31

De plus: si vous êtes Uriun parent Uri AbsoluteUri échouera, ToString()non.

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

Puisque tout le monde semble penser que uri.AbsoluteUric'est mieux, mais parce que cela échoue avec des chemins relatifs, alors la méthode universelle serait probablement:

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

Pourquoi ne pas vérifier et utiliser le bon?

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

L'exemple suivant écrit le contenu complet de l'instance Uri dans la console. Dans l'exemple illustré,

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

est écrit sur la console.

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

La propriété AbsoluteUri inclut l'intégralité de l'URI stocké dans l'instance Uri, y compris tous les fragments et chaînes de requête.

AKMDD Ken
la source