Udostępnij za pośrednictwem


Konfigurowanie opcji serwera internetowego ASP.NET Core Kestrel

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Ostrzeżenie

Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy (Zasady obsługi platformy .NET Core). Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.

Serwer Kestrel internetowy ma opcje konfiguracji ograniczeń, które są szczególnie przydatne we wdrożeniach dostępnych z Internetu. Aby skonfigurować Kestrel opcje konfiguracji, wywołaj metodę ConfigureKestrel w pliku Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

Ustaw ograniczenia dla KestrelServerOptions.Limits właściwości . Ta właściwość zawiera wystąpienie KestrelServerLimits klasy .

Ogólne limity

Limit czasu utrzymania aktywności

KeepAliveTimeoutpobiera lub ustawia limit czasu utrzymania aktywności:

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

Ten limit czasu nie jest wymuszany, gdy debuger jest dołączony do Kestrel procesu.

Maksymalna liczba połączeń klientów

MaxConcurrentConnections pobiera lub ustawia maksymalną liczbę otwartych połączeń:

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

MaxConcurrentUpgradedConnections pobiera lub ustawia maksymalną liczbę otwartych, uaktualnionych połączeń:

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

Uaktualnione połączenie to połączenie, które zostało przełączone z protokołu HTTP do innego protokołu, takiego jak WebSockets. Po uaktualnieniu połączenia nie jest uwzględniany MaxConcurrentConnections limit.

Maksymalny rozmiar treści żądania

MaxRequestBodySize pobiera lub ustawia maksymalny dozwolony rozmiar dowolnej treści żądania w bajtach.

Zalecanym podejściem do zastąpienia limitu w aplikacji ASP.NET Core MVC jest użycie atrybutu RequestSizeLimitAttribute w metodzie akcji:

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

Poniższy przykład umożliwia skonfigurowanie MaxRequestBodySize wszystkich żądań:

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

Poniższy przykład umożliwia skonfigurowanie MaxRequestBodySize dla określonego żądania przy użyciu IHttpMaxRequestBodySizeFeature niestandardowego oprogramowania pośredniczącego:

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

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

    // ...

    await next(context);
});

Jeśli aplikacja próbuje skonfigurować limit żądania po rozpoczęciu odczytywania żądania, zgłaszany jest wyjątek. Ue właściwość IHttpMaxRequestBodySizeFeature.IsReadOnly , aby sprawdzić, czy właściwość jest bezpieczna MaxRequestBodySize .

Gdy aplikacja kończy się poza procesem za modułem ASP.NET Core, usługi IIS ustawiają limit i Kestrellimit rozmiaru treści żądania jest wyłączony.

Minimalna szybkość danych treści żądania

Kestrel sprawdza co sekundę, czy dane docierają do określonej stawki w bajtach/sekundach. Jeśli szybkość spadnie poniżej minimum, przekroczono limit czasu połączenia. Okres prolongaty to czas Kestrel , przez który klient może zwiększyć szybkość wysyłania do minimum. Stawka nie jest sprawdzana w tym czasie. Okres prolongaty pomaga uniknąć porzucania połączeń, które początkowo wysyłają dane z powodu powolnego uruchamiania protokołu TCP. Minimalna stawka ma również zastosowanie do odpowiedzi.

MinRequestBodyDataRate pobiera lub ustawia minimalną szybkość danych treści żądania w bajtach/sekundach. MinResponseDataRate pobiera lub ustawia minimalną szybkość danych odpowiedzi w bajtach/sekundach.

Poniższy przykład konfiguruje MinRequestBodyDataRate i MinResponseDataRate dla wszystkich żądań:

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));
});

Poniższy przykład konfiguruje MinRequestBodyDataRate i MinResponseDataRate dla określonego żądania przy użyciu IHttpMinRequestBodyDataRateFeature oprogramowania pośredniczącego i IHttpMinResponseDataRateFeature w niestandardowym programie pośredniczącym:

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 nie jest obecny dla HttpContext.Features żądań HTTP/2. Modyfikowanie limitów szybkości dla poszczególnych żądań nie jest ogólnie obsługiwane dla protokołu HTTP/2 z powodu obsługi żądań multipleksowania protokołu. Jednak nadal występuje w HttpContext.Features żądaniach HTTP/2, IHttpMinRequestBodyDataRateFeature ponieważ limit szybkości odczytu można nadal wyłączyć całkowicie dla poszczególnych żądań, ustawiając IHttpMinResponseDataRateFeature.MinDataRate nullwartość , nawet w przypadku żądania HTTP/2. Próbuje odczytać IHttpMinRequestBodyDataRateFeature.MinDataRate lub spróbować ustawić ją na wartość inną niż null wynik NotSupportedException dla żądań HTTP/2.

Limity szybkości dla całego serwera skonfigurowane za pośrednictwem KestrelServerOptions.Limits nadal mają zastosowanie zarówno do połączeń HTTP/1.x, jak i HTTP/2.

Limit czasu nagłówków żądań

RequestHeadersTimeout pobiera lub ustawia maksymalny czas, jaki serwer poświęca na odbieranie nagłówków żądań:

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

Ten limit czasu nie jest wymuszany, gdy debuger jest dołączony do Kestrel procesu.

Limity HTTP/2

Limity w tej sekcji są ustawione na .KestrelServerLimits.Http2

Maksymalna liczba strumieni na połączenie

MaxStreamsPerConnection ogranicza liczbę współbieżnych strumieni żądań na połączenie HTTP/2. Nadmiarowe strumienie są odrzucane:

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

Rozmiar tabeli nagłówka

HeaderTableSize ogranicza rozmiar tabel kompresji nagłówka, w oktetach, koder HPACK i dekoder na serwerze może używać. Dekoder HPACK dekompresuje nagłówki HTTP dla połączeń HTTP/2:

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

Maksymalny rozmiar ramki

MaxFrameSize wskazuje rozmiar największego ładunku ramki, który może zostać odebrany, w oktetach:

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

Maksymalny rozmiar nagłówka żądania

MaxRequestHeaderFieldSize wskazuje rozmiar maksymalnego dozwolonego rozmiaru sekwencji pól nagłówka żądania. Ten limit dotyczy zarówno sekwencji nazw, jak i wartości w skompresowanych i nieskompresowanych reprezentacjach:

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

Początkowy rozmiar okna połączenia

InitialConnectionWindowSize wskazuje, ile danych treści żądania serwer chce odbierać i buforować w czasie zagregowanym we wszystkich żądaniach (strumieniach) na połączenie:

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

Żądania są również ograniczone przez InitialStreamWindowSize.

Rozmiar okna początkowego strumienia

InitialStreamWindowSize wskazuje ilość danych treści żądania, które serwer chce odbierać i buforować w danym momencie na strumień:

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

Żądania są również ograniczone przez InitialConnectionWindowSize.

Konfiguracja polecenia ping http/2

Kestrel Można skonfigurować do wysyłania poleceń ping HTTP/2 do połączonych klientów. Polecenia ping HTTP/2 obsługują wiele celów:

  • Zachowaj bezczynność połączeń. Niektórzy klienci i serwery proxy zamykają połączenia bezczynne. Polecenia ping HTTP/2 są traktowane jako działanie w połączeniu i uniemożliwiają zamknięcie połączenia jako bezczynne.
  • Zamknij połączenia w złej kondycji. Połączenia, w których klient nie odpowiada na polecenie ping w skonfigurowanym czasie, są zamykane przez serwer.

Istnieją dwie opcje konfiguracji związane z poleceniami ping http/2:

  • KeepAlivePingDelay to element TimeSpan , który konfiguruje interwał ping. Serwer wysyła do klienta polecenie ping keep alive, jeśli nie otrzyma żadnych ramek przez ten okres czasu. Zachowaj aktywne polecenia ping są wyłączone, gdy ta opcja jest ustawiona na TimeSpan.MaxValue.
  • KeepAlivePingTimeout to element TimeSpan , który konfiguruje limit czasu ping. Jeśli serwer nie otrzyma żadnych ramek, takich jak polecenie ping odpowiedzi, podczas tego limitu czasu połączenie zostanie zamknięte. Zachowaj przy życiu limit czasu jest wyłączony, gdy ta opcja jest ustawiona na TimeSpan.MaxValuewartość .

Następujące przykładowe zestawy KeepAlivePingDelay i KeepAlivePingTimeout:

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

Inne opcje

Synchroniczne operacje we/wy

AllowSynchronousIO określa, czy synchroniczne operacje we/wy są dozwolone dla żądania i odpowiedzi.

Ostrzeżenie

Duża liczba blokowania synchronicznych operacji we/wy może prowadzić do głodu puli wątków, co sprawia, że aplikacja nie odpowiada. Włącz AllowSynchronousIO tylko w przypadku korzystania z biblioteki, która nie obsługuje asynchronicznych operacji we/wy.

Poniższy przykład umożliwia synchroniczne operacje we/wy:

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

Aby uzyskać informacje o innych Kestrel opcjach i limitach, zobacz:

Zachowanie z dołączonym debugerem

Niektóre limity czasu i limity szybkości nie są wymuszane, gdy debuger jest dołączony do Kestrel procesu. Aby uzyskać więcej informacji, zobacz Zachowanie z dołączonym debugerem.

Serwer Kestrel internetowy ma opcje konfiguracji ograniczeń, które są szczególnie przydatne we wdrożeniach dostępnych z Internetu.

Aby zapewnić większą konfigurację po wywołaniu ConfigureWebHostDefaultsmetody , użyj polecenia ConfigureKestrel:

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

Ustaw ograniczenia dla Limits właściwości KestrelServerOptions klasy. Właściwość Limits zawiera wystąpienie KestrelServerLimits klasy .

W poniższych przykładach użyto Microsoft.AspNetCore.Server.Kestrel.Core przestrzeni nazw:

using Microsoft.AspNetCore.Server.Kestrel.Core;

Uwaga

KestrelServerOptionsKonfigurację punktu końcowego można konfigurować z poziomu dostawców konfiguracji. Kestrel Pozostała konfiguracja musi być skonfigurowana w kodzie języka C#.

Ogólne limity

Limit czasu utrzymania aktywności

KeepAliveTimeout

Pobiera lub ustawia limit czasu utrzymania aktywności. Wartość domyślna to 2 minuty.

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);
})

Maksymalna liczba połączeń klientów

MaxConcurrentConnections
MaxConcurrentUpgradedConnections

Maksymalną liczbę współbieżnych otwartych połączeń TCP można ustawić dla całej aplikacji przy użyciu następującego kodu:

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);
})

Istnieje osobny limit połączeń, które zostały uaktualnione z protokołu HTTP lub HTTPS do innego protokołu (na przykład w żądaniu protokołu WebSockets). Po uaktualnieniu połączenia nie jest uwzględniany MaxConcurrentConnections limit.

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);
})

Maksymalna liczba połączeń jest domyślnie nieograniczona (null).

Maksymalny rozmiar treści żądania

MaxRequestBodySize

Domyślny maksymalny rozmiar treści żądania to 30 000 000 bajtów, czyli około 28,6 MB.

Zalecanym podejściem do zastąpienia limitu w aplikacji ASP.NET Core MVC jest użycie atrybutu RequestSizeLimitAttribute w metodzie akcji:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

W poniższym przykładzie pokazano, jak skonfigurować ograniczenie dla aplikacji na każdym żądaniu:

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);
})

Zastąpij ustawienie dla określonego żądania w programie pośredniczącym:

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));
    }

Zgłaszany jest wyjątek, jeśli aplikacja konfiguruje limit żądania po rozpoczęciu odczytywania żądania przez aplikację. IsReadOnly Istnieje właściwość wskazująca, czy MaxRequestBodySize właściwość jest w stanie tylko do odczytu, co oznacza, że jest za późno, aby skonfigurować limit.

Gdy aplikacja kończy się poza procesem za modułem ASP.NET Core Module, Kestrellimit rozmiaru treści żądania jest wyłączony. Usługi IIS już ustawiają limit.

Minimalna szybkość danych treści żądania

MinRequestBodyDataRate
MinResponseDataRate

Kestrel sprawdza co sekundę, czy dane docierają do określonej stawki w bajtach/sekundach. Jeśli szybkość spadnie poniżej minimum, przekroczono limit czasu połączenia. Okres prolongaty to czas Kestrel , przez który klient może zwiększyć szybkość wysyłania do minimum. Stawka nie jest sprawdzana w tym czasie. Okres prolongaty pomaga uniknąć porzucania połączeń, które początkowo wysyłają dane z powodu powolnego uruchamiania protokołu TCP.

Domyślna minimalna stawka to 240 bajtów na sekundę z 5-sekundowym okresem prolongaty.

Minimalna stawka ma również zastosowanie do odpowiedzi. Kod ustawiania limitu żądań i limit odpowiedzi jest taki sam, z wyjątkiem posiadania RequestBody lub Response w nazwach właściwości i interfejsów.

Oto przykład pokazujący sposób konfigurowania minimalnych szybkości danych w programie 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);
})

Zastąpij minimalne limity szybkości na żądanie w programie pośredniczącym:

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));
    }

Odwołanie IHttpMinResponseDataRateFeature w poprzednim przykładzie nie jest obecne w HttpContext.Features żądaniach HTTP/2. Modyfikowanie limitów szybkości dla poszczególnych żądań nie jest ogólnie obsługiwane dla protokołu HTTP/2 z powodu obsługi żądań multipleksowania protokołu. Jednak nadal występuje w IHttpMinRequestBodyDataRateFeature przypadku żądań HTTP/2, ponieważ limit szybkości odczytu można nadal wyłączyć null całkowicie dla poszczególnych żądań, ustawiając IHttpMinResponseDataRateFeature.MinDataRate wartość nawet dla żądania HTTP/HttpContext.Features2. Próba odczytania IHttpMinRequestBodyDataRateFeature.MinDataRate lub próby ustawienia go na wartość inną niż null spowoduje NotSupportedException zgłoszenie żądania HTTP/2.

Limity szybkości dla całego serwera skonfigurowane za pośrednictwem KestrelServerOptions.Limits nadal mają zastosowanie zarówno do połączeń HTTP/1.x, jak i HTTP/2.

Limit czasu nagłówków żądań

RequestHeadersTimeout

Pobiera lub ustawia maksymalny czas, jaki serwer poświęca na odbieranie nagłówków żądań. Wartość domyślna to 30 sekund.

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);
})

Limity HTTP/2

Limity w tej sekcji są ustawione na .KestrelServerLimits.Http2

Maksymalna liczba strumieni na połączenie

MaxStreamsPerConnection

Ogranicza liczbę współbieżnych strumieni żądań na połączenie HTTP/2. Nadmiar strumieni są odrzucane.

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

Wartość domyślna to 100.

Rozmiar tabeli nagłówka

HeaderTableSize

Dekoder HPACK dekompresuje nagłówki HTTP dla połączeń HTTP/2. HeaderTableSize ogranicza rozmiar tabeli kompresji nagłówka używanej przez dekoder HPACK. Wartość jest podana w oktetach i musi być większa niż zero (0).

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

Wartość domyślna to 4096.

Maksymalny rozmiar ramki

MaxFrameSize

Wskazuje maksymalny dozwolony rozmiar ładunku ramki połączenia HTTP/2 odebranego lub wysłanego przez serwer. Wartość jest podana w oktetach i musi należeć do zakresu od 2^14 (16 384) do 2^24-1 (16 777 215).

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

Wartość domyślna to 2^14 (16 384).

Maksymalny rozmiar nagłówka żądania

MaxRequestHeaderFieldSize

Wskazuje maksymalny dozwolony rozmiar w oktetach wartości nagłówka żądania. Ten limit dotyczy zarówno nazwy, jak i wartości w ich skompresowanych i nieskompresowanych reprezentacjach. Wartość musi być większa niż zero (0).

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

Wartość domyślna to 8192.

Początkowy rozmiar okna połączenia

InitialConnectionWindowSize

Wskazuje maksymalne dane treści żądania w bajtach serwera jednocześnie zagregowane we wszystkich żądaniach (strumieniach) na połączenie. Żądania są również ograniczone przez Http2.InitialStreamWindowSize. Wartość musi być większa lub równa 65 535 i mniejsza niż 2^31 (2147 483 648).

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

Wartość domyślna to 128 KB (131 072).

Rozmiar okna początkowego strumienia

InitialStreamWindowSize

Wskazuje maksymalne dane treści żądania w bajtach serwera jednocześnie na żądanie (strumień). Żądania są również ograniczone przez InitialConnectionWindowSize. Wartość musi być większa lub równa 65 535 i mniejsza niż 2^31 (2147 483 648).

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

Wartość domyślna to 96 KB (98 304).

Konfiguracja polecenia ping http/2

Kestrel Można skonfigurować do wysyłania poleceń ping HTTP/2 do połączonych klientów. Polecenia ping HTTP/2 obsługują wiele celów:

  • Zachowaj bezczynność połączeń. Niektórzy klienci i serwery proxy zamykają połączenia bezczynne. Polecenia ping HTTP/2 są traktowane jako działanie w połączeniu i uniemożliwiają zamknięcie połączenia jako bezczynne.
  • Zamknij połączenia w złej kondycji. Połączenia, w których klient nie odpowiada na polecenie ping w skonfigurowanym czasie, są zamykane przez serwer.

Istnieją dwie opcje konfiguracji związane z poleceniami ping http/2:

  • KeepAlivePingDelay to element TimeSpan , który konfiguruje interwał ping. Serwer wysyła do klienta polecenie ping keep alive, jeśli nie otrzyma żadnych ramek przez ten okres czasu. Zachowaj aktywne polecenia ping są wyłączone, gdy ta opcja jest ustawiona na TimeSpan.MaxValue. Domyślna wartość to TimeSpan.MaxValue.
  • KeepAlivePingTimeout to element TimeSpan , który konfiguruje limit czasu ping. Jeśli serwer nie otrzyma żadnych ramek, takich jak polecenie ping odpowiedzi, podczas tego limitu czasu połączenie zostanie zamknięte. Zachowaj przy życiu limit czasu jest wyłączony, gdy ta opcja jest ustawiona na TimeSpan.MaxValuewartość . Wartość domyślna to 20 sekund.
webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});

Inne opcje

Synchroniczne operacje we/wy

AllowSynchronousIO określa, czy synchroniczne operacje we/wy są dozwolone dla żądania i odpowiedzi. Domyślna wartość to false.

Ostrzeżenie

Duża liczba blokowania synchronicznych operacji we/wy może prowadzić do głodu puli wątków, co sprawia, że aplikacja nie odpowiada. Włącz AllowSynchronousIO tylko w przypadku korzystania z biblioteki, która nie obsługuje asynchronicznych operacji we/wy.

Poniższy przykład umożliwia synchroniczne operacje we/wy:

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

Aby uzyskać informacje o innych Kestrel opcjach i limitach, zobacz: