Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 10 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e do .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Por David Acker
Pedido de middleware para descompressão
- Permite que os pontos de extremidade da API aceitem solicitações com conteúdo compactado.
- Usa o cabeçalho HTTP
Content-Encodingpara identificar e descompactar automaticamente solicitações que contêm conteúdo compactado. - Elimina a necessidade de escrever código para lidar com solicitações compactadas.
Quando o Content-Encoding valor do cabeçalho de um pedido corresponde a um dos fornecedores de descompressão disponíveis, o middleware:
- Utiliza o provedor compatível para envolver o HttpRequest.Body num fluxo de descompressão apropriado.
- Remove o
Content-Encodingcabeçalho, indicando que o corpo do pedido já não está comprimido.
Pedidos que não incluem um Content-Encoding cabeçalho são ignorados pelo middleware de descompressão de pedidos.
Descompressão:
- Ocorre quando o corpo do pedido é lido. Ou seja, a descompressão ocorre no ponto final da ligação ao modelo. O corpo do pedido não é descomprimido com entusiasmo.
- Ao tentar ler o corpo do pedido descomprimido com dados comprimidos que são inválidos para o
Content-Encodingespecificado, uma exceção é lançada. Brotli pode lançar System.InvalidOperationException: Decoder ran into invalid data. Deflate e GZip podem lançar System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.
Se o middleware encontrar um pedido com conteúdo comprimido mas não conseguir descomprimi-lo, o pedido é passado para o próximo delegado no pipeline. Por exemplo, um pedido com um valor de cabeçalho Content-Encoding não suportado ou com múltiplos valores de cabeçalho Content-Encoding é encaminhado para o delegado seguinte na linha de processamento (pipeline).
Configuração
O seguinte código utiliza AddRequestDecompression(IServiceCollection) e UseRequestDecompression para permitir a descompressão de pedidos para os tipos predefinidosContent-Encoding :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestDecompression();
var app = builder.Build();
app.UseRequestDecompression();
app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));
app.Run();
Fornecedores padrão de descompressão
Os Content-Encoding valores dos cabeçalhos que o middleware de descompressão de solicitações suporta por padrão estão listados na tabela seguinte.
Content-Encoding valores de cabeçalho |
Description |
|---|---|
br |
Formato de dados comprimidos Brotli |
deflate |
DEFLATE formato de dados compactados |
gzip |
Formato de arquivo Gzip |
Fornecedores personalizados de descompressão
O suporte para codificações personalizadas pode ser adicionado criando classes de fornecedor de descompressão personalizadas que implementem IDecompressionProvider:
public class CustomDecompressionProvider : IDecompressionProvider
{
public Stream GetDecompressionStream(Stream stream)
{
// Perform custom decompression logic here
return stream;
}
}
Os fornecedores personalizados de descompressão são registados com RequestDecompressionOptions junto com os seus valores de cabeçalho correspondentes Content-Encoding.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRequestDecompression(options =>
{
options.DecompressionProviders.Add("custom", new CustomDecompressionProvider());
});
var app = builder.Build();
app.UseRequestDecompression();
app.MapPost("/", (HttpRequest request) => Results.Stream(request.Body));
app.Run();
Limites ao tamanho do pedido
Para proteger-se contra bombas zip ou bombas de descompressão:
- O tamanho máximo do corpo do pedido descomprimido é limitado ao limite de tamanho do corpo do pedido imposto pelo endpoint ou servidor.
- Se o número de bytes lidos do fluxo do corpo do pedido descomprimido exceder o limite, será lançado um InvalidOperationException para impedir que bytes adicionais sejam lidos do fluxo.
Por ordem de precedência, o tamanho máximo do pedido para um endpoint é definido por:
- IRequestSizeLimitMetadata.MaxRequestBodySize, como RequestSizeLimitAttribute ou DisableRequestSizeLimitAttribute para endpoints MVC.
- Limite global do tamanho do servidor IHttpMaxRequestBodySizeFeature.MaxRequestBodySize.
MaxRequestBodySizepode ser substituído por pedido com IHttpMaxRequestBodySizeFeature.MaxRequestBodySize, mas, por padrão, corresponde ao limite configurado para a implementação do servidor web.
| Implementação de servidor web |
MaxRequestBodySize configuração |
|---|---|
| HTTP.sys | HttpSysOptions.MaxRequestBodySize |
| IIS | IISServerOptions.MaxRequestBodySize |
| Kestrel | KestrelServerLimits.MaxRequestBodySize |
Advertência
Remover o limite de tamanho do corpo do pedido representa um risco de segurança em relação ao consumo descontrolado de recursos, especialmente se o corpo do pedido estiver em buffer. Garantir que existem salvaguardas para mitigar o risco de ataques de negação de serviço (DoS).