2011-10-02 8 views
62

Como comentario a una pregunta Azure hace un momento, @smarx señaló¿Cuál es la diferencia entre Uri.ToString() y Uri.AbsoluteUri?

Creo que es generalmente mejor que hacer que blob.Uri.AbsoluteUri blob.Uri.ToString().

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

Respuesta

74

Dada 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á un URL legible: http://somehost/somepath?somekey=some+value

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

+24

Pero tenga en cuenta que el "URL legible" (regresar de ToString) probablemente esté dañada y casi nunca lo que quiere: http://code.logos.com/blog/2010/08/uritostring_must_die.html . Evitaría llamar a ToString siempre que sea posible. –

+1

Hay ocasiones en que desea ToString. Aquí en SO es un gran ejemplo (ver mi respuesta más arriba). Quieres "visualizar" la URL. El punto (siempre en la programación) es: tenga cuidado y sepa lo que está haciendo. –

+2

Tenga en cuenta que el ejemplo aquí (y en http://code.logos.com/blog/2010/08/uritostring_must_die.html) ya no está vigente. Estos problemas se han solucionado en .NET Framework 4.5. Sin embargo, ToString() solo está destinado a la representación humana legible (visual) de la URL. Si copia esta URL en el navegador, aún debería funcionar. – arni

22

Además: Si suUri es una relativoUriAbsoluteUri fallará, ToString() no.

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

Como todo el mundo parece pensar que uri.AbsoluteUri es mejor, pero debido a que falla con rutas relativas, entonces probablemente la forma más universal sería:

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

Por qué no comprobar y utilizar la correcta?

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