Solicitar descompactaçã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 9 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. 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.
Importante
Essas informações relacionam-se ao produto de pré-lançamento, que poderá ser substancialmente modificado antes do lançamento comercial. A Microsoft não oferece nenhuma garantia, explícita ou implícita, quanto às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Por David Acker
Solicitar middleware de descompactação:
- Permite que os pontos de extremidade de 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 gravar código para manipular solicitações compactadas.
Quando o valor do cabeçalho Content-Encoding
em uma solicitação corresponde a um dos provedores de descompactação disponíveis, o middleware:
- Usa o provedor correspondente para encapsular o HttpRequest.Body em um fluxo de descompactação apropriado.
- Remove o cabeçalho
Content-Encoding
, indicando que o corpo da solicitação não está mais compactado.
As solicitações que não incluem um cabeçalho Content-Encoding
são ignoradas pelo middleware de descompactação da solicitação.
Descompactação:
- Ocorre quando o corpo da solicitação é lido. Ou seja, a descompactação ocorre no ponto de extremidade na associação de modelo. O corpo da solicitação não é descompactado rapidamente.
- Ao tentar ler o corpo da solicitação descompactado com dados compactados inválidos para o
Content-Encoding
especificado, uma exceção é gerada. Brotli pode gerar System.InvalidOperationException: Deflate e GZip Decoder ran into invalid data. podem gerar System.IO.InvalidDataException: The archive entry was compressed using an unsupported compression method.
Se o middleware encontrar uma solicitação com conteúdo compactado, mas não puder descompactá-la, a solicitação será passada para o próximo representante no pipeline. Por exemplo, uma solicitação com um valor de cabeçalho Content-Encoding
sem suporte ou com vários valores de cabeçalho Content-Encoding
é passada para o próximo representante no pipeline.
Configuração
O seguinte código usa AddRequestDecompression(IServiceCollection) e UseRequestDecompression para habilitar a descompactação de solicitação para os tipos padrão Content-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();
Provedores de descompactação padrão
OsContent-Encoding
valores de cabeçalho aos quais o middleware de descompactação de solicitação dá suporte por padrão estão listados na tabela a seguir:
Valores do cabeçalho Content-Encoding |
Descrição |
---|---|
br |
Formato de dados compactados Brotli |
deflate |
Formato de dados compactados DEFLATE |
gzip |
Formato de arquivo Gzip |
Provedores de descompactação personalizados
O suporte para codificações personalizadas pode ser adicionado criando classes de provedor de descompactação personalizadas que implementam IDecompressionProvider:
public class CustomDecompressionProvider : IDecompressionProvider
{
public Stream GetDecompressionStream(Stream stream)
{
// Perform custom decompression logic here
return stream;
}
}
Os provedores de descompactação personalizados são registrados com RequestDecompressionOptions juntamente com 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 de tamanho de solicitação
Para se proteger contra bombas zip ou bombas de descompactação:
- O tamanho máximo do corpo de solicitação descompactado é limitado ao limite de tamanho do corpo da solicitação imposto pelo ponto de extremidade ou servidor.
- Se o número de bytes lidos do fluxo do corpo da solicitação descompactado exceder o limite, uma InvalidOperationException será gerada para impedir que bytes adicionais sejam lidos do fluxo.
Em ordem de precedência, o tamanho máximo da solicitação para um ponto de extremidade é definido por:
- IRequestSizeLimitMetadata.MaxRequestBodySize, como RequestSizeLimitAttribute ou DisableRequestSizeLimitAttribute para pontos de extremidade MVC.
- O limite de tamanho do servidor global IHttpMaxRequestBodySizeFeature.MaxRequestBodySize.
MaxRequestBodySize
pode ser substituído por solicitação com IHttpMaxRequestBodySizeFeature.MaxRequestBodySize, mas o padrão é o limite configurado para a implementação do servidor Web.
Uma implementação do servidor Web | Configuração de MaxRequestBodySize |
---|---|
HTTP.sys | HttpSysOptions.MaxRequestBodySize |
IIS | IISServerOptions.MaxRequestBodySize |
Kestrel | KestrelServerLimits.MaxRequestBodySize |
Aviso
Desabilitar o limite de tamanho do corpo da solicitação representa um risco de segurança em relação ao consumo de recursos não controlado, especialmente se o corpo da solicitação estiver sendo armazenado em buffer. Certifique-se de que as proteções estejam em vigor para atenuar o risco de ataques de negação de serviço (DoS, na sigla em inglês).