Sdílet prostřednictvím


Konfigurace možností webového serveru ASP.NET Core Kestrel

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Webový Kestrel server má možnosti konfigurace omezení, které jsou užitečné zejména v nasazeních s internetovým prostředím. Pokud chcete konfigurovat Kestrel možnosti konfigurace, zavolejte ConfigureKestrel do Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

Nastavte omezení vlastnosti KestrelServerOptions.Limits . Tato vlastnost obsahuje instanci KestrelServerLimits třídy.

Obecné limity

Časový limit zachování

KeepAliveTimeout získá nebo nastaví časový limit zachování:

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

Tento časový limit se nevynucuje při připojení ladicího programu k Kestrel procesu.

Maximální počet připojení klientů

MaxConcurrentConnections získá nebo nastaví maximální počet otevřených připojení:

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

MaxConcurrentUpgradedConnections získá nebo nastaví maximální počet otevřených a upgradovaných připojení:

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

Upgradované připojení je připojení, které bylo převedeno z HTTP na jiný protokol, například WebSockets. Po upgradu připojení se do limitu MaxConcurrentConnections nezapočítává.

Maximální velikost textu požadavku

MaxRequestBodySize získá nebo nastaví maximální povolenou velikost libovolného textu požadavku v bajtech.

Doporučeným přístupem k přepsání limitu v aplikaci ASP.NET Core MVC je použití atributu RequestSizeLimitAttribute pro metodu akce:

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

Následující příklad konfiguruje MaxRequestBodySize všechny požadavky:

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

Následující příklad konfiguruje MaxRequestBodySize konkrétní požadavek pomocí IHttpMaxRequestBodySizeFeature vlastního middlewaru:

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

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

    // ...

    await next(context);
});

Pokud se aplikace pokusí nakonfigurovat limit požadavku po spuštění čtení požadavku, vyvolá se výjimka. Ue vlastnost zkontrolujte IHttpMaxRequestBodySizeFeature.IsReadOnly , jestli je bezpečné nastavit MaxRequestBodySize vlastnost.

Když aplikace za modulem ASP.NET Core běží mimo proces, služba IIS nastaví limit a Kestrellimit velikosti textu požadavku je zakázaný.

Minimální přenosová rychlost textu požadavku

Kestrel kontroluje každou sekundu, pokud data přicházejí na zadanou rychlost v bajtech za sekundu. Pokud rychlost klesne pod minimum, vyprší časový limit připojení. Doba odkladu umožňuje Kestrel klientovi zvýšit rychlost odesílání až na minimum. Rychlost se během této doby nekontroluje. Období odkladu pomáhá vyhnout se vyřazení připojení, která zpočátku odesílají data pomalou rychlostí kvůli pomalému spuštění protokolu TCP. Minimální sazba se vztahuje také na odpověď.

MinRequestBodyDataRate získá nebo nastaví minimální datovou rychlost požadavku v bajtech za sekundu. MinResponseDataRate získá nebo nastaví minimální rychlost odezvy v bajtech za sekundu.

Následující příklad nakonfiguruje MinRequestBodyDataRate a MinResponseDataRate pro všechny požadavky:

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

Následující příklad nakonfiguruje MinRequestBodyDataRate a MinResponseDataRate pro konkrétní požadavek pomocí IHttpMinRequestBodyDataRateFeature a IHttpMinResponseDataRateFeature ve vlastním middlewaru:

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 není k dispozici HttpContext.Features pro požadavky HTTP/2. Úprava limitů rychlosti na základě požadavku se obecně nepodporuje pro HTTP/2 kvůli podpoře protokolu multiplexování požadavků. U požadavků HTTP/2 však stále existuje, IHttpMinRequestBodyDataRateFeature protože limit rychlosti čtení je stále možné zcela zakázat na základě nastavení IHttpMinResponseDataRateFeature.MinDataRate nullna požadavek , a to i pro požadavek HTTP/HttpContext.Features2. Pokusy o čtení IHttpMinRequestBodyDataRateFeature.MinDataRate nebo pokusy o jeho nastavení na jinou hodnotu, než null je výsledkem NotSupportedException požadavků HTTP/2.

Omezení rychlosti na úrovni serveru nakonfigurovaná prostřednictvím KestrelServerOptions.Limits stále platí pro připojení HTTP/1.x i HTTP/2.

Vypršení časového limitu hlavičky požadavku

RequestHeadersTimeout získá nebo nastaví maximální dobu, po kterou server stráví příjmem hlaviček požadavků:

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

Tento časový limit se nevynucuje při připojení ladicího programu k Kestrel procesu.

Limity HTTP/2

Omezení v této části jsou nastavena na KestrelServerLimits.Http2.

Maximální počet datových proudů na připojení

MaxStreamsPerConnection omezuje počet souběžných datových proudů požadavků na připojení HTTP/2. Nadbytečné proudy jsou odmítnuty:

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

Velikost tabulky záhlaví

HeaderTableSize omezuje velikost tabulek komprese hlaviček v oktech, kodér HPACK a dekodér na serveru může použít. Dekodér HPACK dekomprimuje hlavičky HTTP pro připojení HTTP/2:

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

Maximální velikost rámce

MaxFrameSize určuje velikost největší datové části rámce, která se může přijímat, v oktech:

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

Maximální velikost hlavičky požadavku

MaxRequestHeaderFieldSize určuje velikost maximální povolené velikosti posloupnosti polí hlavičky požadavku. Tento limit platí pro sekvence názvů a hodnot v komprimovaných i nekomprimovaných reprezentacích:

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

Počáteční velikost okna připojení

InitialConnectionWindowSize označuje, kolik dat textu požadavku je server ochotný přijímat a ukládat do vyrovnávací paměti v době agregované napříč všemi požadavky (streamy) na připojení:

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

Požadavky jsou také omezeny InitialStreamWindowSize.

Počáteční velikost okna datového proudu

InitialStreamWindowSize určuje, kolik dat textu požadavku je server ochotný přijímat a ukládat do vyrovnávací paměti v čase podle datového proudu:

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

Požadavky jsou také omezeny InitialConnectionWindowSize.

Http/2 udržovat konfiguraci příkazu ping naživu

Kestrel lze nakonfigurovat tak, aby odesílala příkazy PING protokolu HTTP/2 připojeným klientům. Příkazy ping HTTP/2 slouží k více účelům:

  • Udržujte nečinná připojení naživu. Někteří klienti a proxy servery ukončují připojení, která jsou nečinná. Příkazy ping HTTP/2 se považují za aktivitu připojení a brání zavření připojení jako nečinné.
  • Ukončete připojení, která nejsou v pořádku. Připojení, ve kterých klient nereaguje na příkaz ping v nakonfigurované době, server zavře.

Existují dvě možnosti konfigurace související s protokolem HTTP/2, aby zůstaly aktivní příkazy ping:

  • KeepAlivePingDelay je nakonfigurovaný TimeSpan interval ping. Server odešle klientovi příkaz ping naživu, pokud v tomto časovém období neobdrží žádné rámce. Zachovat aktivní příkazy ping jsou zakázány, pokud je tato možnost nastavena na TimeSpan.MaxValue.
  • KeepAlivePingTimeout je konfigurace TimeSpan časového limitu příkazu ping. Pokud server neobdrží žádné rámce, například příkaz ping odpovědi, během tohoto časového limitu se připojení zavře. Časový limit zachování je zakázán, pokud je tato možnost nastavena na TimeSpan.MaxValuehodnotu .

Následující ukázkové sady KeepAlivePingDelay a KeepAlivePingTimeout:

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

Další možnosti

Synchronní vstupně-výstupní operace

AllowSynchronousIO určuje, jestli je pro požadavek a odpověď povolen synchronní vstupně-výstupní operace.

Upozorňující

Velký počet blokujících synchronní vstupně-výstupní operace může vést k hladovění fondu vláken, což způsobí, že aplikace nereaguje. Povolte AllowSynchronousIO pouze při použití knihovny, která nepodporuje asynchronní vstupně-výstupní operace.

Následující příklad umožňuje synchronní vstupně-výstupní operace:

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

Informace o dalších Kestrel možnostech a omezeních najdete tady:

Chování s připojeným ladicím programem

Při připojení ladicího programu k Kestrel procesu se nevynucují určité časové limity a limity rychlosti. Další informace naleznete v tématu Chování s připojeným ladicím programem.

Webový Kestrel server má možnosti konfigurace omezení, které jsou užitečné zejména v nasazeních s internetovým prostředím.

Pokud chcete po volání ConfigureWebHostDefaultsposkytnout další konfiguraci, použijte ConfigureKestrel:

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

Nastavte omezení vlastnosti Limits KestrelServerOptions třídy. Vlastnost Limits obsahuje instanci KestrelServerLimits třídy.

Následující příklady používají Microsoft.AspNetCore.Server.Kestrel.Core obor názvů:

using Microsoft.AspNetCore.Server.Kestrel.Core;

Poznámka:

KestrelServerOptionskonfigurace koncového bodu je možné konfigurovat od poskytovatelů konfigurace. Zbývající Kestrel konfigurace musí být nakonfigurovaná v kódu jazyka C#.

Obecné limity

Časový limit zachování

KeepAliveTimeout

Získá nebo nastaví časový limit udržování. Výchozí hodnota je 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);
})

Maximální počet připojení klientů

MaxConcurrentConnections
MaxConcurrentUpgradedConnections

Maximální počet souběžných otevřených připojení TCP lze nastavit pro celou aplikaci pomocí následujícího kódu:

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

Pro připojení upgradovaná z HTTP nebo HTTPS na jiný protokol (například v požadavku WebSockets) existuje samostatný limit. Po upgradu připojení se do limitu MaxConcurrentConnections nezapočítává.

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

Maximální počet připojení je ve výchozím nastavení neomezený (null).

Maximální velikost textu požadavku

MaxRequestBodySize

Výchozí maximální velikost těla požadavku je 30 000 000 bajtů, což je přibližně 28,6 MB.

Doporučeným přístupem k přepsání limitu v aplikaci ASP.NET Core MVC je použití atributu RequestSizeLimitAttribute pro metodu akce:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Následující příklad ukazuje, jak nakonfigurovat omezení pro aplikaci na každém požadavku:

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

Přepište nastavení konkrétního požadavku v middlewaru:

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

Pokud aplikace nakonfiguruje limit požadavku poté, co aplikace začne číst požadavek, vyvolá se výjimka. IsReadOnly Existuje vlastnost, která označuje, jestli MaxRequestBodySize je vlastnost ve stavu jen pro čtení, což znamená, že je příliš pozdě na konfiguraci limitu.

Když za modulem ASP.NET Core dochází k vyčerpání procesu aplikace, Kestrelje limit velikosti těla požadavku zakázaný. Služba IIS už limit nastaví.

Minimální přenosová rychlost textu požadavku

MinRequestBodyDataRate
MinResponseDataRate

Kestrel kontroluje každou sekundu, pokud data přicházejí na zadanou rychlost v bajtech za sekundu. Pokud rychlost klesne pod minimum, vyprší časový limit připojení. Doba odkladu umožňuje Kestrel klientovi zvýšit rychlost odesílání až na minimum. Rychlost se během této doby nekontroluje. Období odkladu pomáhá vyhnout se vyřazení připojení, která zpočátku odesílají data pomalou rychlostí kvůli pomalému spuštění protokolu TCP.

Výchozí minimální sazba je 240 bajtů za sekundu s 5sekundovým obdobím odkladu.

Minimální sazba se vztahuje také na odpověď. Kód pro nastavení limitu požadavku a limit odpovědi je stejný s výjimkou vlastností RequestBody nebo Response názvů rozhraní.

Tady je příklad, který ukazuje, jak nakonfigurovat minimální rychlost dat v 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);
})

Přepsání minimálních limitů rychlosti na požadavek v middlewaru:

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

Odkazovaný IHttpMinResponseDataRateFeature v předchozí ukázce není pro požadavky HTTP/2 k dispozici HttpContext.Features . Úprava limitů rychlosti na základě požadavku se obecně nepodporuje pro HTTP/2 kvůli podpoře protokolu multiplexování požadavků. IHttpMinRequestBodyDataRateFeature Stále však platí HttpContext.Features pro požadavky HTTP/2, protože limit rychlosti čtení je stále možné zakázat zcela na základě požadavku na požadavek, a to nastavením IHttpMinResponseDataRateFeature.MinDataRate null dokonce i pro požadavek HTTP/2. Pokus o přečtení IHttpMinRequestBodyDataRateFeature.MinDataRate nebo pokus o jeho nastavení na jinou hodnotu, než null způsobí NotSupportedException vyvolání požadavku HTTP/2.

Omezení rychlosti na úrovni serveru nakonfigurovaná prostřednictvím KestrelServerOptions.Limits stále platí pro připojení HTTP/1.x i HTTP/2.

Vypršení časového limitu hlavičky požadavku

RequestHeadersTimeout

Získá nebo nastaví maximální dobu, po kterou server stráví příjmem hlaviček požadavků. Výchozí hodnota je 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

Omezení v této části jsou nastavena na KestrelServerLimits.Http2.

Maximální počet datových proudů na připojení

MaxStreamsPerConnection

Omezuje počet souběžných datových proudů požadavků na připojení HTTP/2. Nadbytečné proudy jsou odmítnuty.

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

Výchozí hodnota je 100.

Velikost tabulky záhlaví

HeaderTableSize

Dekodér HPACK dekomprimuje hlavičky HTTP pro připojení HTTP/2. HeaderTableSize omezuje velikost tabulky komprese hlaviček, kterou dekodér HPACK používá. Hodnota je zadána v oktetech a musí být větší než nula (0).

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

Výchozí hodnota je 4096.

Maximální velikost rámce

MaxFrameSize

Určuje maximální povolenou velikost datové části rámce připojení HTTP/2 přijaté nebo odeslané serverem. Hodnota je zadaná v oktetech a musí být mezi 2^14 (16 384) a 2^24-1 (16 777 215).

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

Výchozí hodnota je 2^14 (16 384).

Maximální velikost hlavičky požadavku

MaxRequestHeaderFieldSize

Určuje maximální povolenou velikost v oktetech hodnot hlavičky požadavku. Tento limit platí pro název i hodnotu v komprimovaných i nekomprimovaných reprezentacích. Hodnota musí být větší než nula (0).

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

Výchozí hodnota je 8 192.

Počáteční velikost okna připojení

InitialConnectionWindowSize

Označuje maximální data textu požadavku v bajtech vyrovnávací paměti serveru najednou agregovaná napříč všemi požadavky (datovými proudy) na připojení. Požadavky jsou také omezeny Http2.InitialStreamWindowSize. Hodnota musí být větší nebo rovna 65 535 a menší než 2^31 (2 147 483 648).

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

Výchozí hodnota je 128 kB (131 072).

Počáteční velikost okna datového proudu

InitialStreamWindowSize

Označuje maximální data textu požadavku v bajtech vyrovnávací paměti serveru najednou na každý požadavek (datový proud). Požadavky jsou také omezeny InitialConnectionWindowSize. Hodnota musí být větší nebo rovna 65 535 a menší než 2^31 (2 147 483 648).

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

Výchozí hodnota je 96 kB (98 304).

Http/2 udržovat konfiguraci příkazu ping naživu

Kestrel lze nakonfigurovat tak, aby odesílala příkazy PING protokolu HTTP/2 připojeným klientům. Příkazy ping HTTP/2 slouží k více účelům:

  • Udržujte nečinná připojení naživu. Někteří klienti a proxy servery ukončují připojení, která jsou nečinná. Příkazy ping HTTP/2 se považují za aktivitu připojení a brání zavření připojení jako nečinné.
  • Ukončete připojení, která nejsou v pořádku. Připojení, ve kterých klient nereaguje na příkaz ping v nakonfigurované době, server zavře.

Existují dvě možnosti konfigurace související s protokolem HTTP/2, aby zůstaly aktivní příkazy ping:

  • KeepAlivePingDelay je nakonfigurovaný TimeSpan interval ping. Server odešle klientovi příkaz ping naživu, pokud v tomto časovém období neobdrží žádné rámce. Zachovat aktivní příkazy ping jsou zakázány, pokud je tato možnost nastavena na TimeSpan.MaxValue. Výchozí hodnota je TimeSpan.MaxValue.
  • KeepAlivePingTimeout je konfigurace TimeSpan časového limitu příkazu ping. Pokud server neobdrží žádné rámce, například příkaz ping odpovědi, během tohoto časového limitu se připojení zavře. Časový limit zachování je zakázán, pokud je tato možnost nastavena na TimeSpan.MaxValuehodnotu . Výchozí hodnota je 20 sekund.
webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});

Další možnosti

Synchronní vstupně-výstupní operace

AllowSynchronousIO určuje, jestli je pro požadavek a odpověď povolen synchronní vstupně-výstupní operace. Výchozí hodnota je false.

Upozorňující

Velký počet blokujících synchronní vstupně-výstupní operace může vést k hladovění fondu vláken, což způsobí, že aplikace nereaguje. Povolte AllowSynchronousIO pouze při použití knihovny, která nepodporuje asynchronní vstupně-výstupní operace.

Následující příklad umožňuje synchronní vstupně-výstupní operace:

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

Informace o dalších Kestrel možnostech a omezeních najdete tady: