Konfigurieren von Optionen für den ASP.NET Core-Kestrel-Webserver
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Wichtig
Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.
Die aktuelle Version finden Sie in der .NET 9-Version dieses Artikels.
Der Kestrel-Webserver verfügt über einschränkende Konfigurationsoptionen, die besonders nützlich bei Bereitstellungen mit Internetzugriff sind. Rufen Sie zum Konfigurieren von Kestrel-Konfigurationsoptionen ConfigureKestrel in Program.cs
auf:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
// ...
});
Legen Sie Einschränkungen für die KestrelServerOptions.Limits-Eigenschaft fest. Diese Eigenschaft enthält eine Instanz der KestrelServerLimits-Klasse.
Allgemeine Grenzwerte
Keep-Alive-Timeout
KeepAliveTimeout ruft das Keep-Alive-Timeout ab oder legt es fest:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});
Dieses Timeout wird nicht erzwungen, wenn ein Debugger an den Kestrel-Prozess angefügt ist.
Maximale Anzahl der Clientverbindungen
MaxConcurrentConnections ruft die maximale Anzahl offener Verbindungen ab oder legt sie fest:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
});
MaxConcurrentUpgradedConnections ruft die maximale Anzahl offener, aktualisierter Verbindungen ab oder legt sie fest:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
});
Bei einer aktualisierten Verbindung handelt es sich um eine Verbindung, die von HTTP in ein anderes Protokoll wie WebSockets umgestellt wurde. Nachdem eine Verbindung aktualisiert wurde, zählt diese nicht mehr für den MaxConcurrentConnections
-Grenzwert.
Maximale Größe des Anforderungstexts
MaxRequestBodySize ruft die maximal zulässige Größe eines Anforderungstexts in Bytes ab oder legt sie fest.
Die empfohlene Methode zur Außerkraftsetzung des Grenzwerts in einer ASP.NET Core-MVC-App besteht im Verwenden des RequestSizeLimitAttribute-Attributs in einer Aktionsmethode:
[RequestSizeLimit(100_000_000)]
public IActionResult Get()
Im folgenden Beispiel wird MaxRequestBodySize
für alle Anforderungen konfiguriert:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxRequestBodySize = 100_000_000;
});
Im folgenden Beispiel wird MaxRequestBodySize
für eine bestimmte Anforderung mithilfe von IHttpMaxRequestBodySizeFeature in einer benutzerdefinierten Middleware konfiguriert:
app.Use(async (context, next) =>
{
var httpMaxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();
if (httpMaxRequestBodySizeFeature is not null)
httpMaxRequestBodySizeFeature.MaxRequestBodySize = 10 * 1024;
// ...
await next(context);
});
Wenn die App versucht, den Grenzwert für eine Anforderung zu konfigurieren, nachdem mit dem Lesen der Anforderung begonnen wurde, wird eine Ausnahme ausgelöst. Verwenden Sie die Eigenschaft IHttpMaxRequestBodySizeFeature.IsReadOnly, um zu prüfen, ob Sie die Eigenschaft MaxRequestBodySize
festlegen können.
Wenn eine App prozessextern hinter dem ASP.NET Core-Modul ausgeführt wird, wird der Grenzwert von IIS festgelegt und der Grenzwert von Kestrel für die Anforderungstextgröße deaktiviert.
Minimale Datenrate des Anforderungstexts
Kestrel überprüft sekündlich, ob Daten mit der angegebenen Rate in Bytes/Sekunde eingehen. Wenn die Rate den mindestens erforderlichen Wert unterschreitet, wird für die Verbindung wegen Timeout getrennt. Bei der Toleranzperiode handelt es sich um die Zeitspanne, die Kestrel dem Client gewährt, um die Senderate auf den mindestens erforderlichen Wert zu erhöhen. Die Rate wird während dieser Zeit nicht geprüft. Diese Toleranzperiode beugt dem Trennen von Verbindungen vor, die Daten aufgrund eines langsamen TCP-Starts anfänglich mit einer niedrigen Rate senden. Für die Antwort gilt ebenfalls eine mindestens erforderliche Rate.
MinRequestBodyDataRate ruft die Mindestdatenrate des Anforderungstexts in Bytes/s ab oder legt diese fest. MinResponseDataRate ruft die Mindestdatenrate der Antwort in Bytes/s ab oder legt diese fest.
Im folgenden Beispiel werden MinRequestBodyDataRate
und MinResponseDataRate
für alle Anforderungen konfiguriert:
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));
});
Im folgenden Beispiel werden MinRequestBodyDataRate
und MinResponseDataRate
für eine bestimmte Anforderung mithilfe von IHttpMinRequestBodyDataRateFeature und IHttpMinResponseDataRateFeature in einer benutzerdefinierten Middleware konfiguriert:
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
ist in HttpContext.Features für HTTP/2-Anforderungen nicht vorhanden. Das Ändern der Ratenlimits auf Anforderungsbasis wird in der Regel für HTTP/2 nicht unterstützt, weil das Protokoll Anforderungsmultiplexing unterstützt. IHttpMinRequestBodyDataRateFeature
ist jedoch in HttpContext.Features
für HTTP/2-Anforderungen noch vorhanden, weil der Grenzwert für die Leserate weiterhin für jede Anforderung vollständig deaktiviert werden kann, indem IHttpMinResponseDataRateFeature.MinDataRate auch für eine HTTP/2-Anforderung auf null
festgelegt wird. Versuche, IHttpMinRequestBodyDataRateFeature.MinDataRate
zu lesen oder auf einen anderen Wert als null
festzulegen, führen bei HTTP/2-Anforderungen zu NotSupportedException.
Serverweite Ratenlimits, die über KestrelServerOptions.Limits konfiguriert sind, gelten auch für HTTP/1.x- und HTTP/2-Verbindungen.
Timeout für Anforderungsheader
RequestHeadersTimeout ruft die maximale Zeitspanne ab, in der der Server Anforderungsheader empfängt, oder legt diese fest:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
Dieses Timeout wird nicht erzwungen, wenn ein Debugger an den Kestrel-Prozess angefügt ist.
HTTP/2-Limits
Die Limits in diesem Abschnitt sind auf KestrelServerLimits.Http2 festgelegt.
Maximale Datenströme pro Verbindung
MaxStreamsPerConnection schränkt die Anzahl gleichzeitiger Anforderungsdatenströme pro HTTP/2-Verbindung ein. Überschüssige Datenströme werden zurückgewiesen:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Größe der Headertabelle
HeaderTableSize begrenzt die Größe der Headerkomprimierungstabellen in Oktetten, die der HPACK-Encoder und -Decoder auf dem Server verwenden kann. Der HPACK-Decoder dekomprimiert HTTP-Header für HTTP/2-Verbindungen:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Maximale Framegröße
MaxFrameSize gibt die Größe der größten Nutzdaten eines Frames an, die empfangen werden dürfen, in Oktetten an:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16_384;
});
Maximale Größe des Anforderungsheaders
MaxRequestHeaderFieldSize gibt die maximal zulässige Größe einer Feldsequenz im Anforderungsheader an. Dieser Grenzwert gilt sowohl für Namens- als auch Wertsequenzen in der komprimierten und nicht komprimierten Darstellung:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
Anfangsfenstergröße der Verbindung
InitialConnectionWindowSize gibt an, wie viele Anforderungstextdaten der Server jeweils zu empfangen und zu puffern bereit ist, und zwar aggregiert über alle Anforderungen (Datenströme) pro Verbindung:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131_072;
});
Anforderungen werden auch durch InitialStreamWindowSize
beschränkt.
Anfangsfenstergröße des Streams
InitialStreamWindowSize gibt an, wie viele Anforderungstextdaten der Server bereit ist, pro Datenstrom zu empfangen und zu puffern:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98_304;
});
Anforderungen werden auch durch InitialConnectionWindowSize
beschränkt.
Konfiguration für HTTP/2-Keep-Alive-Pings
Kestrel kann so konfiguriert werden, dass HTTP/2-Pings an verbundene Clients gesendet werden. HTTP/2-Pings dienen mehreren Zwecken:
- Verbindungen im Leerlauf werden aktiv gehalten. Einige Clients und Proxyserver trennen Verbindungen, die sich im Leerlauf befinden. HTTP/2-Pings werden als Aktivität einer Verbindung betrachtet und verhindern, dass die Verbindung getrennt wird.
- Fehlerhafte Verbindungen werden getrennt. Verbindungen, bei denen der Client nicht innerhalb der konfigurierten Zeit auf einen Keep-Alive-Ping antwortet, werden vom Server getrennt.
Es gibt zwei Konfigurationsoptionen für HTTP/2-Keep-Alive-Pings:
- KeepAlivePingDelay ist eine TimeSpan, die das Pingintervall konfiguriert. Der Server sendet einen Keep-Alive-Ping an den Client, wenn dieser für diesen Zeitraum keine Frames erhält. Durch Festlegen dieser Option auf TimeSpan.MaxValue werden Keep-Alive-Pings deaktiviert.
- KeepAlivePingTimeout ist eine TimeSpan, die das Ping-Timeout konfiguriert. Wenn der Server während dieses Timeouts keine Frames (z. B. als Antwort-Ping) empfängt, wird die Verbindung getrennt. Durch Festlegen dieser Option auf TimeSpan.MaxValue wird das Keep-Alive-Timeout deaktiviert.
Im folgenden Beispiel werden KeepAlivePingDelay
und KeepAlivePingTimeout
festgelegt:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromMinutes(1);
});
Weitere Optionen
Synchrone E/A-Vorgänge
AllowSynchronousIO steuert, ob für Anforderung und Antwort synchrone E/A-Vorgänge zulässig sind.
Warnung
Sehr viele blockierende synchrone E/A-Vorgänge können zu einem Ressourcenmangel im Threadpool führen, wodurch die App nicht mehr reagiert. Aktivieren Sie AllowSynchronousIO
nur bei Verwendung einer Bibliothek, die asynchrone E/A-Vorgänge nicht unterstützt.
Das folgende Beispiel aktiviert synchrone E/A-Vorgänge:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
});
Weitere Informationen zu anderen Kestrel-Optionen und -Einschränkungen finden Sie unter:
Verhalten mit angefügtem Debugger
Bestimmte Timeouts und Ratenbegrenzungen werden nicht erzwungen, wenn ein Debugger an einen Kestrel-Prozess angefügt ist. Weitere Informationen finden Sie unter Verhalten mit angefügtem Debugger.
Der Kestrel-Webserver verfügt über einschränkende Konfigurationsoptionen, die besonders nützlich bei Bereitstellungen mit Internetzugriff sind.
Um eine weitere Konfiguration nach dem Aufruf von ConfigureWebHostDefaults bereitzustellen, verwenden Sie ConfigureKestrel:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
// Set properties and call methods on options
})
.UseStartup<Startup>();
});
Legen Sie Einschränkungen für die Limits-Eigenschaft der KestrelServerOptions-Klasse fest. Die Limits
-Eigenschaft enthält eine Instanz der KestrelServerLimits-Klasse.
In den folgenden Beispielen wird der Microsoft.AspNetCore.Server.Kestrel.Core-Namespace verwendet:
using Microsoft.AspNetCore.Server.Kestrel.Core;
Hinweis
KestrelServerOptions und die KestrelServerOptions können über Konfigurationsanbieter konfiguriert werden. Die verbleibende Kestrel-Konfiguration muss in C#-Code konfiguriert werden.
Allgemeine Grenzwerte
Keep-Alive-Timeout
Ruft das Keep-Alive-Timeout ab oder legt es fest. Standardwert: 2 Minuten.
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);
})
Maximale Anzahl der Clientverbindungen
MaxConcurrentConnections
MaxConcurrentUpgradedConnections
Die maximale Anzahl von gleichzeitig geöffneten TCP-Verbindungen kann mithilfe von folgendem Code für die gesamte App festgelegt werden:
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);
})
Es gibt einen separaten Grenzwert für Verbindungen, die von HTTP oder HTTPS auf ein anderes Protokoll aktualisiert wurden (z.B. auf eine WebSockets-Anforderung). Nachdem eine Verbindung aktualisiert wurde, zählt diese nicht mehr für den MaxConcurrentConnections
-Grenzwert.
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);
})
Die maximale Anzahl von Verbindungen ist standardmäßig nicht begrenzt (NULL).
Maximale Größe des Anforderungstexts
Die maximale Größe des Anforderungstexts beträgt standardmäßig 30.000.000 Byte, also ungefähr 28,6 MB.
Die empfohlene Methode zur Außerkraftsetzung des Grenzwerts in einer ASP.NET Core-MVC-App besteht im Verwenden des RequestSizeLimitAttribute-Attributs in einer Aktionsmethode:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Im folgenden Beispiel wird veranschaulicht, wie die Einschränkungen bei jeder Anforderung für die App konfiguriert werden:
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);
})
Außer Kraft setzen der Einstellung für eine bestimmte Anforderung in 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));
}
Eine Ausnahme wird ausgelöst, wenn die App den Grenzwert einer Anforderung konfiguriert, nachdem die App bereits mit dem Lesen der Anforderung begonnen hat. Es gibt eine IsReadOnly
-Eigenschaft, die angibt, wenn sich die MaxRequestBodySize
-Eigenschaft im schreibgeschützten Zustand befindet, also wenn der Grenzwert nicht mehr konfiguriert werden kann.
Wenn eine App prozessextern hinter dem ASP.NET Core-Modul ausgeführt wird, ist das Größenlimit von Kestrel für Anforderungstext deaktiviert. IIS legt das Limit bereits fest.
Minimale Datenrate des Anforderungstexts
MinRequestBodyDataRate
MinResponseDataRate
Kestrel überprüft sekündlich, ob Daten mit der angegebenen Rate in Bytes/Sekunde eingehen. Wenn die Rate den mindestens erforderlichen Wert unterschreitet, wird für die Verbindung wegen Timeout getrennt. Bei der Toleranzperiode handelt es sich um die Zeitspanne, die Kestrel dem Client gewährt, um die Senderate auf den mindestens erforderlichen Wert zu erhöhen. Die Rate wird während dieser Zeit nicht geprüft. Diese Toleranzperiode beugt dem Trennen von Verbindungen vor, die Daten aufgrund eines langsamen TCP-Starts anfänglich mit einer niedrigen Rate senden.
Die mindestens erforderliche Rate beträgt standardmäßig 240 Bytes/Sekunde mit einer Toleranzperiode von 5 Sekunden.
Für die Antwort gilt ebenfalls eine mindestens erforderliche Rate. Der Code zum Festlegen des Grenzwerts für Anforderung und Antwort ist abgesehen von RequestBody
oder Response
in den Namen von Eigenschaften und Schnittstelle identisch.
In diesem Beispiel wird veranschaulicht, wie Sie die mindestens erforderlichen Datenraten in Program.cs
konfigurieren:
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);
})
Außer Kraft setzen des minimalen Ratenlimits pro Anforderung in 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));
}
Das IHttpMinResponseDataRateFeature, auf das im vorherigen Beispiel verwiesen wird, ist in HttpContext.Features für HTTP/2-Anforderungen nicht vorhanden. Das Ändern der Ratenlimits auf Anforderungsbasis wird in der Regel für HTTP/2 nicht unterstützt, weil das Protokoll Anforderungsmultiplexing unterstützt. IHttpMinRequestBodyDataRateFeature ist jedoch in HttpContext.Features
für HTTP/2-Anforderungen noch vorhanden, weil das Leseratenlimit weiterhin für jede Anforderung vollständig deaktiviert werden kann, indem IHttpMinResponseDataRateFeature.MinDataRate auch für eine HTTP/2-Anforderung auf null
festgelegt wird. Der Versuch, IHttpMinRequestBodyDataRateFeature.MinDataRate
zu lesen oder auf einen anderen Wert als null
festzulegen, führt dazu, dass bei einer HTTP/2-Anforderung eine NotSupportedException ausgelöst wird.
Serverweite Ratenlimits, die über KestrelServerOptions.Limits konfiguriert sind, gelten auch für HTTP/1.x- und HTTP/2-Verbindungen.
Timeout für Anforderungsheader
Ruft die maximale Zeitspanne ab, während der der Server Anforderungsheader empfängt, oder legt diese fest. Der Standardwert beträgt 30 Sekunden.
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);
})
HTTP/2-Limits
Die Limits in diesem Abschnitt sind auf KestrelServerLimits.Http2 festgelegt.
Maximale Datenströme pro Verbindung
Schränkt die Anzahl gleichzeitiger Anforderungsdatenströme pro HTTP/2-Verbindung ein. Überschüssige Datenströme werden zurückgewiesen.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Der Standardwert ist 100.
Größe der Headertabelle
Der HPACK-Decoder dekomprimiert HTTP-Header für HTTP/2-Verbindungen. HeaderTableSize
schränkt die Größe der Headerkomprimierungstabelle ein, die der HPACK-Decoder verwendet. Der Wert wird in Oktetten bereitgestellt und muss größer als null (0) sein.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Der Standardwert ist 4096.
Maximale Framegröße
Gibt die maximal zulässige Größe einer vom Server empfangenen oder gesendeten HTTP/2-Verbindungsframe-Nutzlast an. Der Wert wird in Oktetten bereitgestellt und muss zwischen 2^14 (16.384) und 2^24-1 (16.777.215) liegen.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16384;
});
Der Standardwert ist 2^14 (16.384).
Maximale Größe des Anforderungsheaders
Gibt die maximal zulässige Größe der Anforderungsheaderwerte in Oktetten an. Dieser Grenzwert gilt sowohl für den Namen als auch den Wert in der komprimierten und nicht komprimierten Darstellung. Der Wert muss größer als 0 (null) sein.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
Der Standardwert ist 8.192.
Anfangsfenstergröße der Verbindung
Gibt die maximalen Anforderungstextdaten in Byte an, die der Server zu einem bestimmten Zeitpunkt für alle Anforderungen (Datenströme) pro Verbindung aggregiert. Anforderungen werden auch durch Http2.InitialStreamWindowSize
beschränkt. Der Wert muss größer als oder gleich 65.535 und kleiner als 2^31 (2.147.483.648) sein.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});
Der Standardwert ist 128 KB (131.072).
Anfangsfenstergröße des Streams
Gibt die maximalen Anforderungstextdaten in Byte an, die der Server zu einem bestimmten Zeitpunkt pro Anforderung (Stream) puffert. Anforderungen werden auch durch InitialConnectionWindowSize
beschränkt. Der Wert muss größer als oder gleich 65.535 und kleiner als 2^31 (2.147.483.648) sein.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});
Der Standardwert ist 96 KB (98.304).
Konfiguration für HTTP/2-Keep-Alive-Pings
Kestrel kann so konfiguriert werden, dass HTTP/2-Pings an verbundene Clients gesendet werden. HTTP/2-Pings dienen mehreren Zwecken:
- Verbindungen im Leerlauf werden aktiv gehalten. Einige Clients und Proxyserver trennen Verbindungen, die sich im Leerlauf befinden. HTTP/2-Pings werden als Aktivität einer Verbindung betrachtet und verhindern, dass die Verbindung getrennt wird.
- Fehlerhafte Verbindungen werden getrennt. Verbindungen, bei denen der Client nicht innerhalb der konfigurierten Zeit auf einen Keep-Alive-Ping antwortet, werden vom Server getrennt.
Es gibt zwei Konfigurationsoptionen für HTTP/2-Keep-Alive-Pings:
- KeepAlivePingDelay ist eine TimeSpan, die das Pingintervall konfiguriert. Der Server sendet einen Keep-Alive-Ping an den Client, wenn dieser für diesen Zeitraum keine Frames erhält. Durch Festlegen dieser Option auf TimeSpan.MaxValue werden Keep-Alive-Pings deaktiviert. Standardwert: TimeSpan.MaxValue.
- KeepAlivePingTimeout ist eine TimeSpan, die das Ping-Timeout konfiguriert. Wenn der Server während dieses Timeouts keine Frames (z. B. als Antwort-Ping) empfängt, wird die Verbindung getrennt. Durch Festlegen dieser Option auf TimeSpan.MaxValue wird das Keep-Alive-Timeout deaktiviert. Der Standardwert ist 20 Sekunden.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});
Weitere Optionen
Synchrone E/A-Vorgänge
AllowSynchronousIO steuert, ob für Anforderung und Antwort synchrone E/A-Vorgänge zulässig sind. Der Standardwert ist false
.
Warnung
Sehr viele blockierende synchrone E/A-Vorgänge können zu einem Ressourcenmangel im Threadpool führen, wodurch die App nicht mehr reagiert. Aktivieren Sie AllowSynchronousIO
nur bei Verwendung einer Bibliothek, die asynchrone E/A-Vorgänge nicht unterstützt.
Das folgende Beispiel aktiviert synchrone E/A-Vorgänge:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
})
Weitere Informationen zu anderen Kestrel-Optionen und -Einschränkungen finden Sie unter: