Partilhar via


Uri Limites de comprimento removidos

Os métodos que criam Uri instâncias (construtores e TryCreate métodos de fábrica) historicamente limitaram o comprimento da cadeia de caracteres URI a cerca de 65.000 caracteres (os limites exatos variaram ligeiramente dependendo do formato de entrada). Estes limites foram removidos de tal forma que praticamente não existe um limite máximo para a duração das instâncias Uri.

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, não era possível criar uma Uri instância cujo comprimento excedesse cerca de 65.000 caracteres. Código como o exemplo a seguir lançou um UriFormatException com a mensagem "URI inválida: A cadeia de caracteres de URI é muito longa."

new Uri($"https://host/{new string('a', 100_000)}");

Novo comportamento

A partir do .NET 10, Uri instâncias contendo grandes quantidades de dados agora podem ser criadas. Por exemplo:

string largeQuery = ...;
return new Uri($"https://someService/?query={Uri.EscapeDataString(largeQuery)}");

As restrições removidas aplicam-se principalmente a caminhos, consultas e fragmentos como os componentes mais práticos para transportar grandes quantidades de dados. Componentes como o esquema e o host ainda podem impor alguns limites de comprimento. Limitações práticas à medida que você se aproxima dos limites de comprimento também se aplicam, então você não pode (nem deve) usar string para representar um arquivo de Uri 10 GB.

Tipo de mudança disruptiva

Esta alteração é de natureza comportamental .

Motivo da mudança

A maioria dos servidores HTTP impõe restrições de comprimento estritas em URLs que estão dispostos a aceitar em solicitações. Os limites são geralmente muito mais baixos do que os limites anteriores de Uri. No entanto, como Uri é o tipo de troca de facto no .NET para informações semelhantes a URI, os limites anteriores restringiam o seu uso em alguns cenários, e não havia boas soluções alternativas a não ser remover o uso de Uri nos contratos das APIs.

Os principais cenários para grandes Uri dimensões são:

  • data: uris, que contêm blobs binários arbitrários codificados em Base64. Eles podem ser transmitidos fora da linha de solicitação HTTP. Por exemplo, eles podem fazer parte do corpo do requerimento e, portanto, podem ser arbitrariamente grandes. Uri agora pode ser usado para representar URIs de dados contendo arquivos maiores.
  • Grandes cadeias de caracteres de consulta. Uri é frequentemente usado como um tipo de troca entre sistemas, mesmo que nunca seja enviado como parte de uma solicitação HTTP. As informações de solicitação do usuário geralmente são codificadas como parte da cadeia de caracteres de consulta, portanto, o novo comportamento permite esses cenários mesmo quando a quantidade de dados aumenta.

Para a maioria dos usuários, não é necessária nenhuma ação.

Agora, se confia no Uri para impor restrições de comprimento como parte da sua validação de entrada, deve realizar a verificação do comprimento por si mesmo, de preferência antes de construir a instância Uri. Como a maioria dos servidores HTTP impõe limites de comprimento muito mais rígidos na prática, entradas muito longas já eram suscetíveis de resultar em falhas quando enviadas como parte de uma solicitação HTTP. Você pode achar que seu cenário se beneficiaria de executar uma validação de comprimento ainda mais rigorosa do que Uri havia feito anteriormente.

APIs afetadas