Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Métodos que criam Uri instâncias (construtores e TryCreate métodos de fábrica) têm historicamente limitado o comprimento da string de URI para cerca de 65.000 caracteres (os limites exatos variaram ligeiramente dependendo do formato de entrada). Esses limites foram levantados de modo que praticamente não há limite superior em relação ao comprimento que as instâncias Uri podem ter.
Versão introduzida
.NET 10
Comportamento anterior
Anteriormente, não era possível criar uma Uri instância cujo comprimento excedia cerca de 65.000 caracteres. Código como o exemplo a seguir lançou um UriFormatException com a mensagem "URI inválido: a cadeia de caracteres Uri é muito longa".
new Uri($"https://host/{new string('a', 100_000)}");
Novo comportamento
A partir do .NET 10, Uri instâncias que contêm 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 se aplicam 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 também se aplicam à medida que você se aproxima dos limites de comprimento de string, portanto, você não pode (nem deve) usar Uri para representar um arquivo de 10 GB.
Tipo de mudança disruptiva
Esta é uma alteração comportamental.
Motivo da alteração
A maioria dos servidores HTTP impõe restrições de comprimento estritas às URLs que eles estão dispostos a aceitar em solicitações. Os limites geralmente são muito menores do que os limites anteriores de Uri. No entanto, como Uri é o tipo de troca de fato no .NET para informações semelhantes a URI, os limites anteriores restringiram seu uso em alguns cenários, sem boas soluções alternativas, exceto remover o uso de Uri em todos os contratos de API.
Os principais cenários para grandes Uri são:
-
data:uris, que contêm blobs binários arbitrários codificados em Base64. Elas podem ser transmitidas fora da linha de solicitação HTTP. Por exemplo, eles podem fazer parte do corpo da solicitação e, portanto, podem ser arbitrariamente grandes. Uri agora pode ser usado para representar URIs de dados que contêm arquivos maiores. - Cadeias de caracteres de consulta grandes. Uri geralmente é usado como um tipo de troca entre sistemas, mesmo que ele 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, de modo que o novo comportamento permite esses cenários, mesmo à medida que a quantidade de dados aumenta.
Ação recomendada
Para a maioria dos usuários, não há nenhuma ação necessária.
Se você depender de Uri para impor restrições de comprimento como parte da validação de entrada, agora deverá executar a verificação de comprimento por conta própria, de preferência como uma etapa antes de construir a instância Uri. Como a maioria dos servidores HTTP impõe limites de comprimento muito mais rigorosos na prática, entradas muito longas já eram prováveis de resultar em falhas quando enviadas como parte de uma solicitação HTTP. Você pode descobrir que seu cenário se beneficiaria de executar uma validação de comprimento ainda mais rigorosa do que Uri havia feito anteriormente.
APIs afetadas
- Uri
- System.Uri.TryCreate
- Todos os membros Uri que retornam informações sobre a instância Uri, tais como: