Partilhar via


Solicitar descompressão no ASP.NET Core

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-Encoding para 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-Encoding cabeç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-Encoding especificado, 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:

  1. IRequestSizeLimitMetadata.MaxRequestBodySize, como RequestSizeLimitAttribute ou DisableRequestSizeLimitAttribute para endpoints MVC.
  2. Limite global do tamanho do servidor IHttpMaxRequestBodySizeFeature.MaxRequestBodySize. MaxRequestBodySize pode 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).

Recursos adicionais