Qual é a diferença entre Uri.ToString () e Uri.AbsoluteUri?


92

Como um comentário a uma questão do Azure agora, @smarx observou

Acho que geralmente é melhor fazer blob.Uri.AbsoluteUri do que blob.Uri.ToString ().

Existe um motivo para isso? A documentação para Uri.AbsoluteUrinotas de que "Obtém o URI absoluto", Uri.ToString()"Obtém uma representação de string canônica para a instância especificada."


1
ToString torna o URI mais legível, mas ao fazer isso, ele decodifica muitos caracteres codificados por URLE, o que pode ser problemático em alguns casos. O comportamento também é diferente entre os tempos de execução da estrutura .net. Consulte dhvik.blogspot.com/2019/12/… para uma comparação.
Dan

Respostas:


103

Dado por exemplo:

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

Neste caso, Uri.ToString()retornará um URL legível por humanos: http: // somehost / somepath? Somekey = some + value

Uri.AbsoluteUri por outro lado, retornará o formulário codificado como HttpUtility.UrlEncode o retornou: http://somehost/somepath?somekey=some%2bvalue


35
Mas observe que o "URL legível por humanos" (retornado de ToString) provavelmente está corrompido e quase nunca é o que você deseja: code.logos.com/blog/2010/08/uritostring_must_die.html . Eu evitaria chamar ToString sempre que possível.
Bradley Grainger

1
Há momentos em que você deseja ToString. Aqui no SO está um ótimo exemplo (veja minha resposta acima). Você deseja "visualizar" o URL. A questão (sempre em programação) é - seja cuidadoso e saiba o que está fazendo.
Ofer Zelig

3
Observe que o exemplo aqui (e em code.logos.com/blog/2010/08/uritostring_must_die.html ) não é mais atual. Esses problemas foram corrigidos no .NET Framework 4.5. No entanto, ToString () ainda serve apenas para representação legível (visual) do URL. Se você copiar este URL para o navegador, ele ainda deve funcionar.
arni de

1
Parece que é melhor usar do OriginialStringque ToString()[ docs.microsoft.com/en-us/dotnet/api/…
karsnen

31

Além disso: se você Urifor um parente Uri AbsoluteUri , ToString()não.

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

5

Já que todo mundo parece pensar que uri.AbsoluteUrié melhor, mas porque falha com caminhos relativos, então provavelmente a forma universal seria:

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

5

Por que não verificar e usar o correto?

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

0

O exemplo a seguir grava o conteúdo completo da instância Uri no console. No exemplo mostrado,

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

é gravado no console.

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

A propriedade AbsoluteUri inclui todo o URI armazenado na instância Uri, incluindo todos os fragmentos e strings de consulta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.