Partilhar via


Configurar opções para o servidor Web ASP.NET Core Kestrel

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 10 deste artigo.

O Kestrel servidor Web tem opções de configuração de restrição que são especialmente úteis em implantações voltadas para a Internet. Para configurar Kestrel as opções de configuração, chame ConfigureKestrel :Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    // ...
});

Defina restrições na KestrelServerOptions.Limits propriedade. Esta propriedade contém uma instância da KestrelServerLimits classe.

Limites gerais

Tempo limite de manter-vivo

KeepAliveTimeout Obtém ou define o tempo limite de keep-alive:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});

Esse tempo limite não é imposto quando um depurador é anexado Kestrel ao processo.

Máximo de conexões de cliente

MaxConcurrentConnections Obtém ou define o número máximo de conexões abertas:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
});

MaxConcurrentUpgradedConnections Obtém ou define o número máximo de conexões abertas e atualizadas:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
});

Uma conexão atualizada é aquela que foi trocada de HTTP para outro protocolo, como WebSockets. Depois que uma conexão é atualizada, ela não é contada para o MaxConcurrentConnections limite.

Tamanho máximo do corpo do pedido

MaxRequestBodySize Obtém ou define o tamanho máximo permitido de qualquer corpo de solicitação em bytes.

A abordagem recomendada para substituir o limite em um aplicativo ASP.NET Core MVC é usar o RequestSizeLimitAttribute atributo em um método de ação:

[RequestSizeLimit(100_000_000)]
public IActionResult Get()

O exemplo a seguir configura para todas as MaxRequestBodySize solicitações:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxRequestBodySize = 100_000_000;
});

O exemplo a MaxRequestBodySize seguir configura para uma solicitação específica usando IHttpMaxRequestBodySizeFeature em um middleware personalizado:

app.Use(async (context, next) =>
{
    var httpMaxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();

    if (httpMaxRequestBodySizeFeature is not null)
        httpMaxRequestBodySizeFeature.MaxRequestBodySize = 10 * 1024;

    // ...

    await next(context);
});

Se o aplicativo tentar configurar o limite em uma solicitação depois de começar a ler a solicitação, uma exceção será lançada. Ue a IHttpMaxRequestBodySizeFeature.IsReadOnly propriedade para verificar se é seguro definir a MaxRequestBodySize propriedade.

Quando um aplicativo é executado fora do processo atrás do ASP.NET Módulo Principal, o IIS define o limite e Kestrelo limite de tamanho do corpo da solicitação é desabilitado.

Taxa mínima de dados do corpo do pedido

Kestrel verifica a cada segundo se os dados estão chegando à taxa especificada em bytes/segundo. Se a taxa cair abaixo do mínimo, a conexão será expirada. O período de carência é a quantidade de tempo Kestrel que permite ao cliente aumentar a sua taxa de envio até ao mínimo. A taxa não é verificada durante esse período. O período de carência ajuda a evitar a queda de conexões que inicialmente estão enviando dados em uma taxa lenta devido ao início lento do TCP. Uma taxa mínima também se aplica à resposta.

MinRequestBodyDataRate Obtém ou define a taxa mínima de dados do corpo da solicitação em bytes/segundo. MinResponseDataRate Obtém ou define a taxa mínima de dados de resposta em bytes/segundo.

O exemplo a seguir configura e MinRequestBodyDataRate para todas as MinResponseDataRate solicitações:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MinRequestBodyDataRate = new MinDataRate(
        bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate = new MinDataRate(
        bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});

O exemplo a MinRequestBodyDataRate seguir configura e MinResponseDataRate para uma solicitação específica usando IHttpMinRequestBodyDataRateFeature e IHttpMinResponseDataRateFeature em um middleware personalizado:

app.Use(async (context, next) =>
{
    var httpMinRequestBodyDataRateFeature = context.Features
        .Get<IHttpMinRequestBodyDataRateFeature>();

    if (httpMinRequestBodyDataRateFeature is not null)
    {
        httpMinRequestBodyDataRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    var httpMinResponseDataRateFeature = context.Features
        .Get<IHttpMinResponseDataRateFeature>();

    if (httpMinResponseDataRateFeature is not null)
    {
        httpMinResponseDataRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    // ...

    await next(context);
});

IHttpMinResponseDataRateFeature não está presente para HttpContext.Features solicitações HTTP/2. A modificação de limites de taxa por solicitação geralmente não é suportada para HTTP/2 devido ao suporte do protocolo para multiplexação de solicitação. No entanto, ainda está presente para IHttpMinRequestBodyDataRateFeature solicitações HTTP/2, porque o limite de taxa de leitura ainda pode ser HttpContext.Features por solicitação, definindo IHttpMinResponseDataRateFeature.MinDataRate como null, mesmo para uma solicitação HTTP/2. Tentativas de leitura IHttpMinRequestBodyDataRateFeature.MinDataRate ou tentativas de defini-lo para um valor diferente de null resultar em um NotSupportedException para solicitações HTTP/2.

Os limites de taxa em todo o servidor configurados via KestrelServerOptions.Limits ainda se aplicam a conexões HTTP/1.x e HTTP/2.

Tempo limite de cabeçalhos de solicitação

RequestHeadersTimeout Obtém ou define a quantidade máxima de tempo que o servidor gasta recebendo cabeçalhos de solicitação:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});

Esse tempo limite não é imposto quando um depurador é anexado Kestrel ao processo.

Limites HTTP/2

Os limites nesta secção são definidos em KestrelServerLimits.Http2.

Máximo de fluxos por ligação

MaxStreamsPerConnection limita o número de fluxos de solicitação simultâneos por conexão HTTP/2. Os fluxos excedentários são recusados:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});

Tamanho da tabela de cabeçalho

HeaderTableSize limita o tamanho das tabelas de compressão de cabeçalho, em octetos, o codificador e decodificador HPACK no servidor pode usar. O decodificador HPACK descompacta cabeçalhos HTTP para conexões HTTP/2:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.HeaderTableSize = 4096;
});

Tamanho máximo do quadro

MaxFrameSize Indica o tamanho da maior carga útil do quadro que pode ser recebida, em octetos:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxFrameSize = 16_384;
});

Tamanho máximo do cabeçalho da solicitação

MaxRequestHeaderFieldSize Indica o tamanho do tamanho máximo permitido de uma sequência de campos de cabeçalho de solicitação. Este limite aplica-se a sequências de nome e valor nas suas representações comprimidas e não comprimidas:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});

Tamanho da janela de conexão inicial

InitialConnectionWindowSize Indica a quantidade de dados do corpo da solicitação que o servidor está disposto a receber e armazenar em buffer de cada vez agregados em todas as solicitações (fluxos) por conexão:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialConnectionWindowSize = 131_072;
});

Os pedidos também são limitados por InitialStreamWindowSize.

Tamanho da janela de fluxo inicial

InitialStreamWindowSize Indica a quantidade de dados do corpo da solicitação que o servidor está disposto a receber e armazenar em buffer de cada vez por fluxo:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialStreamWindowSize = 98_304;
});

Os pedidos também são limitados por InitialConnectionWindowSize.

HTTP/2 manter a configuração de ping ativa

Kestrel pode ser configurado para enviar pings HTTP/2 para clientes conectados. Os pings HTTP/2 servem múltiplos propósitos:

  • Mantenha as conexões ociosas vivas. Alguns clientes e servidores proxy fecham conexões que estão ociosas. Os pings HTTP/2 são considerados como atividade em uma conexão e impedem que a conexão seja fechada como ociosa.
  • Feche conexões não íntegras. As conexões em que o cliente não responde ao ping de manutenção ativa no tempo configurado são fechadas pelo servidor.

Há duas opções de configuração relacionadas a HTTP/2 manter pings vivos:

  • KeepAlivePingDelay é um TimeSpan que configura o intervalo de ping. O servidor envia um ping de manutenção ativa para o cliente se ele não receber nenhum quadro para esse período de tempo. Os pings Manter ativos são desativados quando esta opção está definida como TimeSpan.MaxValue.
  • KeepAlivePingTimeout é um TimeSpan que configura o tempo limite de ping. Se o servidor não receber nenhum quadro, como um ping de resposta, durante esse tempo limite, a conexão será fechada. Manter tempo limite ativo é desativado quando esta opção é definida como TimeSpan.MaxValue.

Os seguintes exemplos são definidos KeepAlivePingDelay e KeepAlivePingTimeout:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromMinutes(1);
});

Outras opções

E/S Síncrona

AllowSynchronousIO controla se a E/S síncrona é permitida para a solicitação e a resposta.

Advertência

Um grande número de operações de E/S síncronas de bloqueio pode levar à fome do pool de threads, o que faz com que o aplicativo não responda. Habilite AllowSynchronousIO apenas ao usar uma biblioteca que não ofereça suporte a E/S assíncronas.

O exemplo a seguir habilita E/S síncronas:

builder.WebHost.ConfigureKestrel(serverOptions =>
{
    serverOptions.AllowSynchronousIO = true;
});

Para obter informações sobre outras Kestrel opções e limites, consulte:

Comportamento com o depurador anexado

As seguintes opções de limite de tempo limite e taxa não são impostas quando um depurador é anexado a um Kestrel processo:

O Kestrel servidor Web tem opções de configuração de restrição que são especialmente úteis em implantações voltadas para a Internet.

Para fornecer mais configuração após a chamada ConfigureWebHostDefaults, use ConfigureKestrel:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseStartup<Startup>();
        });

Defina restrições na Limits propriedade da KestrelServerOptions classe. A Limits propriedade contém uma instância da KestrelServerLimits classe.

Os exemplos a seguir usam o Microsoft.AspNetCore.Server.Kestrel.Core namespace:

using Microsoft.AspNetCore.Server.Kestrel.Core;

Observação

KestrelServerOptions e a configuração do ponto final é configurável a partir de provedores de configuração. A configuração restante Kestrel deve ser configurada em código C#.

Limites gerais

Tempo limite de manter-vivo

KeepAliveTimeout

Obtém ou define o tempo limite de keep-alive. O padrão é de 2 minutos.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

Máximo de conexões de cliente

MaxConcurrentConnections
MaxConcurrentUpgradedConnections

O número máximo de conexões TCP abertas simultâneas pode ser definido para todo o aplicativo com o seguinte código:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

Há um limite separado para conexões que foram atualizadas de HTTP ou HTTPS para outro protocolo (por exemplo, em uma solicitação WebSockets). Depois que uma conexão é atualizada, ela não é contada para o MaxConcurrentConnections limite.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

O número máximo de conexões é ilimitado (nulo) por padrão.

Tamanho máximo do corpo do pedido

MaxRequestBodySize

O tamanho máximo padrão do corpo da solicitação é de 30.000.000 bytes, o que equivale a aproximadamente 28,6 MB.

A abordagem recomendada para substituir o limite em um aplicativo ASP.NET Core MVC é usar o RequestSizeLimitAttribute atributo em um método de ação:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

O exemplo a seguir mostra como configurar a restrição para o aplicativo em cada solicitação:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

Substitua a configuração em uma solicitação específica no middleware:

app.Run(async (context) =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>()
        .MaxRequestBodySize = 10 * 1024;

    var minRequestRateFeature =
        context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
    var minResponseRateFeature =
        context.Features.Get<IHttpMinResponseDataRateFeature>();

    if (minRequestRateFeature != null)
    {
        minRequestRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    if (minResponseRateFeature != null)
    {
        minResponseRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

Uma exceção será lançada se o aplicativo configurar o limite em uma solicitação depois que o aplicativo começar a ler a solicitação. Há uma IsReadOnly propriedade que indica se a MaxRequestBodySize propriedade está em estado somente leitura, o que significa que é tarde demais para configurar o limite.

Quando um aplicativo é executado fora do processo atrás do ASP.NET Core Module, Kestrelo limite de tamanho do corpo da solicitação é desativado. O IIS já define o limite.

Taxa mínima de dados do corpo do pedido

MinRequestBodyDataRate
MinResponseDataRate

Kestrel verifica a cada segundo se os dados estão chegando à taxa especificada em bytes/segundo. Se a taxa cair abaixo do mínimo, a conexão será expirada. O período de carência é a quantidade de tempo Kestrel que permite ao cliente aumentar a sua taxa de envio até ao mínimo. A taxa não é verificada durante esse período. O período de carência ajuda a evitar a queda de conexões que inicialmente estão enviando dados em uma taxa lenta devido ao início lento do TCP.

A taxa mínima padrão é de 240 bytes/segundo com um período de carência de 5 segundos.

Uma taxa mínima também se aplica à resposta. O código para definir o limite de solicitação e o limite de resposta é o mesmo, exceto para ter RequestBody ou Response nos nomes de propriedade e interface.

Aqui está um exemplo que mostra como configurar as taxas mínimas de dados em Program.cs:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

Substitua os limites de taxa mínima por solicitação no middleware:

app.Run(async (context) =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>()
        .MaxRequestBodySize = 10 * 1024;

    var minRequestRateFeature =
        context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
    var minResponseRateFeature =
        context.Features.Get<IHttpMinResponseDataRateFeature>();

    if (minRequestRateFeature != null)
    {
        minRequestRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    if (minResponseRateFeature != null)
    {
        minResponseRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

O IHttpMinResponseDataRateFeature referenciado no exemplo anterior não está presente em HttpContext.Features solicitações HTTP/2. A modificação de limites de taxa por solicitação geralmente não é suportada para HTTP/2 devido ao suporte do protocolo para multiplexação de solicitação. No entanto, o IHttpMinRequestBodyDataRateFeature ainda está presente HttpContext.Features para solicitações HTTP/2, porque o limite de taxa de leitura ainda pode ser desativado inteiramente por solicitação, definindo IHttpMinResponseDataRateFeature.MinDataRate até mesmo para null uma solicitação HTTP/2. Tentar ler IHttpMinRequestBodyDataRateFeature.MinDataRate ou tentar defini-lo para um valor diferente resultará null em um NotSupportedException lançamento dado a uma solicitação HTTP/2.

Os limites de taxa em todo o servidor configurados via KestrelServerOptions.Limits ainda se aplicam a conexões HTTP/1.x e HTTP/2.

Tempo limite de cabeçalhos de solicitação

RequestHeadersTimeout

Obtém ou define a quantidade máxima de tempo que o servidor gasta recebendo cabeçalhos de solicitação. O padrão é de 30 segundos.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

Limites HTTP/2

Os limites nesta secção são definidos em KestrelServerLimits.Http2.

Máximo de fluxos por ligação

MaxStreamsPerConnection

Limita o número de fluxos de solicitação simultâneos por conexão HTTP/2. Os fluxos em excesso são recusados.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});

O valor padrão é 100.

Tamanho da tabela de cabeçalho

HeaderTableSize

O decodificador HPACK descompacta cabeçalhos HTTP para conexões HTTP/2. HeaderTableSize limita o tamanho da tabela de compressão de cabeçalho que o descodificador HPACK utiliza. O valor é fornecido em octetos e deve ser maior que zero (0).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.HeaderTableSize = 4096;
});

O valor padrão é 4096.

Tamanho máximo do quadro

MaxFrameSize

Indica o tamanho máximo permitido de uma carga útil de quadro de conexão HTTP/2 recebida ou enviada pelo servidor. O valor é fornecido em octetos e deve estar entre 2^14 (16.384) e 2^24-1 (16.777.215).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxFrameSize = 16384;
});

O valor padrão é 2^14 (16.384).

Tamanho máximo do cabeçalho da solicitação

MaxRequestHeaderFieldSize

Indica o tamanho máximo permitido em octetos de valores de cabeçalho de solicitação. Esse limite se aplica ao nome e ao valor em suas representações compactadas e não compactadas. O valor deve ser maior que zero (0).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});

O valor padrão é 8.192.

Tamanho da janela de conexão inicial

InitialConnectionWindowSize

Indica o máximo de dados do corpo da solicitação em bytes que o servidor armazena em buffer de uma só vez, agregados em todas as solicitações (fluxos) por conexão. Os pedidos também são limitados por Http2.InitialStreamWindowSize. O valor deve ser maior ou igual a 65.535 e menor que 2^31 (2.147.483.648).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});

O valor padrão é 128 KB (131.072).

Tamanho da janela de fluxo inicial

InitialStreamWindowSize

Indica o máximo de dados do corpo da solicitação em bytes que o servidor armazena em buffer de uma vez por solicitação (fluxo). Os pedidos também são limitados por InitialConnectionWindowSize. O valor deve ser maior ou igual a 65.535 e menor que 2^31 (2.147.483.648).

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});

O valor padrão é 96 KB (98.304).

HTTP/2 manter a configuração de ping ativa

Kestrel pode ser configurado para enviar pings HTTP/2 para clientes conectados. Os pings HTTP/2 servem múltiplos propósitos:

  • Mantenha as conexões ociosas vivas. Alguns clientes e servidores proxy fecham conexões que estão ociosas. Os pings HTTP/2 são considerados como atividade em uma conexão e impedem que a conexão seja fechada como ociosa.
  • Feche conexões não íntegras. As conexões em que o cliente não responde ao ping de manutenção ativa no tempo configurado são fechadas pelo servidor.

Há duas opções de configuração relacionadas a HTTP/2 manter pings vivos:

  • KeepAlivePingDelay é um TimeSpan que configura o intervalo de ping. O servidor envia um ping de manutenção ativa para o cliente se ele não receber nenhum quadro para esse período de tempo. Os pings Manter ativos são desativados quando esta opção está definida como TimeSpan.MaxValue. O valor predefinido é TimeSpan.MaxValue.
  • KeepAlivePingTimeout é um TimeSpan que configura o tempo limite de ping. Se o servidor não receber nenhum quadro, como um ping de resposta, durante esse tempo limite, a conexão será fechada. Manter tempo limite ativo é desativado quando esta opção é definida como TimeSpan.MaxValue. O valor padrão é 20 segundos.
webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});

Outras opções

E/S Síncrona

AllowSynchronousIO controla se a E/S síncrona é permitida para a solicitação e a resposta. O valor predefinido é false.

Advertência

Um grande número de operações de E/S síncronas de bloqueio pode levar à fome do pool de threads, o que faz com que o aplicativo não responda. Habilite AllowSynchronousIO apenas ao usar uma biblioteca que não ofereça suporte a E/S assíncronas.

O exemplo a seguir habilita E/S síncronas:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.AllowSynchronousIO = true;
})

Para obter informações sobre outras Kestrel opções e limites, consulte: