Konfigurowanie opcji serwera internetowego ASP.NET Core Kestrel
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.
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ą, zobacz wersję tego artykułu platformy .NET 9.
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 null
wartość , 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
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
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.Features
2. 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ń
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
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
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
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
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
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
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: