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


Como un comentario a una pregunta de Azure justo ahora, @smarx notó

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

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


68
2017-10-02 06:41


origen


Respuestas:


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 = algo + valor

Uri.AbsoluteUri por otro lado, devolverá el formulario codificado cuando HttpUtility.UrlEncode lo devuelva: http://somehost/somepath?somekey=some%2bvalue


78
2017-10-02 06:44



Adicionalmente: Si tu Uri es un relativo  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

22
2017-10-02 15:59



Ya que todo el mundo parece pensar eso uri.AbsoluteUri es mejor, pero debido a que falla con caminos relativos, entonces probablemente el camino universal sería:

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

4
2018-03-14 19:01



¿Por qué no verificar y usar el correcto?

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

4
2018-02-17 20:30