¿Cuál es la diferencia entre Uri.ToString () y Uri.AbsoluteUri?

92

Como comentario a una pregunta de Azure hace un momento, @smarx señaló

Creo que, en general, es mejor hacer blob.Uri.AbsoluteUri que blob.Uri.ToString ().

¿Hay alguna razón para esto? La documentación de las Uri.AbsoluteUrinotas que "Obtiene el URI absoluto", Uri.ToString()"Obtiene una representación de cadena canónica para la instancia especificada".

Jeremy McGee
fuente
1
ToString hace que el URI sea más legible, pero al hacerlo, decodifica muchos caracteres URLEncoded, lo que será problemático en algunos casos. El comportamiento también es diferente entre los tiempos de ejecución del marco .net. Consulte dhvik.blogspot.com/2019/12/… para obtener una comparación.
Dan

Respuestas:

103

Dado por ejemplo:

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

En este caso, Uri.ToString()devolverá una URL legible por humanos: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri por otro lado, devolverá la forma codificada como HttpUtility.UrlEncode la devolvió: http://somehost/somepath?somekey=some%2bvalue

Ofer Zelig
fuente
35
Pero tenga en cuenta que la "URL legible por humanos" (devuelta por ToString) probablemente esté dañada y casi nunca sea lo que desea: code.logos.com/blog/2010/08/uritostring_must_die.html . Evitaría llamar a ToString siempre que sea posible.
Bradley Grainger
1
Hay ocasiones en las que sí quieres ToString. Aquí en SO hay un gran ejemplo (vea mi respuesta arriba). Quieres "visualizar" la URL. El punto (siempre en la programación) es: tenga cuidado y sepa lo que está haciendo.
Ofer Zelig
3
Tenga en cuenta que el ejemplo aquí (y en code.logos.com/blog/2010/08/uritostring_must_die.html ) ya no está actualizado. Estos problemas se han solucionado en .NET Framework 4.5. Sin embargo, ToString () solo está destinado a la representación (visual) legible por humanos de la URL. Si copia esta URL en el navegador, aún debería funcionar.
arni
1
Parece que es mejor usarlo OriginialStringque ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen
31

Además: si tu Uries un familiar Uri AbsoluteUri fallará, ToString()no.

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

Dado que todo el mundo parece pensar que uri.AbsoluteUries mejor, pero debido a que falla con las rutas relativas, probablemente la forma universal sería:

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

¿Por qué no comprobar y utilizar el correcto?

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

El siguiente ejemplo escribe el contenido completo de la instancia de Uri en la consola. En el ejemplo mostrado,

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

se escribe en la consola.

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

La propiedad AbsoluteUri incluye todo el URI almacenado en la instancia de Uri, incluidos todos los fragmentos y cadenas de consulta.

AKMDD Ken
fuente