大量阻止同步 I/O 的操作可能会导致线程池资源不足,进而导致应用无响应。 仅在使用不支持异步 I/O 的库时,才启用
AllowSynchronousIO
。
builder.WebHost.ConfigureKestrel(serverOptions =>
serverOptions.AllowSynchronousIO = true;
有关其他 Kestrel 选项和限制的信息,请参阅:
KestrelServerOptions
KestrelServerLimits
ListenOptions
附加了调试器的行为
将调试器附加到 Kestrel 进程时,不会强制实施某些超时和速率限制。 有关详细信息,请参阅
附加了调试器的行为
。
Kestrel Web 服务器具有约束配置选项,这些选项在面向 Internet 的部署中尤其有用。
若要在调用
ConfigureWebHostDefaults
后提供更多配置,请使用
ConfigureKestrel
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.ConfigureKestrel(serverOptions =>
// Set properties and call methods on options
.UseStartup<Startup>();
对 KestrelServerOptions 类的 Limits 属性设置约束。 Limits
属性包含 KestrelServerLimits 类的实例。
下面的示例使用 Microsoft.AspNetCore.Server.Kestrel.Core 命名空间。
using Microsoft.AspNetCore.Server.Kestrel.Core;
在本文后面的示例中,Kestrel 选项是采用 C# 代码配置的。 还可以使用Kestrel设置 Kestrel 选项。 例如,文件配置提供程序可以从 appsettings.json
或 appsettings.{Environment}.json
文件加载 Kestrel 配置:
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
"DisableStringReuse": true
KestrelServerOptions 和 KestrelServerOptions 可以通过配置提供程序进行配置。 其余的 Kestrel 配置必须采用 C# 代码进行配置。
使用以下方法之一:
在 Startup.ConfigureServices
中配置 Kestrel:
将 IConfiguration
的实例注入到 Startup
类中。 下面的示例假定注入的配置已分配给 Configuration
属性。
在 Startup.ConfigureServices
中,将配置的 Kestrel
部分加载到 Kestrel 的配置中:
using Microsoft.Extensions.Configuration
public class Startup
public Startup(IConfiguration configuration)
Configuration = configuration;
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
services.Configure<KestrelServerOptions>(
Configuration.GetSection("Kestrel"));
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
生成主机时,配置 Kestrel:
在 Program.cs
中,将配置的 Kestrel
部分加载到 Kestrel 的配置中:
// using Microsoft.Extensions.DependencyInjection;
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((context, services) =>
services.Configure<KestrelServerOptions>(
context.Configuration.GetSection("Kestrel"));
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>();
上述两种方法适用于任何配置提供程序。
保持活动状态超时
KeepAliveTimeout
获取或设置保持活动状态超时。 默认值为 2 分钟。
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);
客户端最大连接数
MaxConcurrentConnections
MaxConcurrentUpgradedConnections
可使用以下代码为整个应用设置并发打开的最大 TCP 连接数:
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 或 HTTPS 升级到另一个协议(例如,Websocket 请求)的连接,有一个单独的限制。 连接升级后,不会计入 MaxConcurrentConnections
限制。
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);
默认情况下,最大连接数不受限制 (NULL)。
请求正文最大大小
MaxRequestBodySize
默认的请求正文最大大小为 30,000,000 字节,大约 28.6 MB。
在 ASP.NET Core MVC 应用中替代限制的推荐方法是在操作方法上使用 RequestSizeLimitAttribute 属性:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
以下示例显示了如何针对每个请求为应用配置约束:
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);
在中间件中替代特定请求的设置:
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));
如果应用在开始读取请求后配置请求限制,则会引发异常。 IsReadOnly
属性指示 MaxRequestBodySize
属性处于只读状态,意味已经无法再配置限制。
当应用在 ASP.NET Core 模块后于进程外运行时,Kestrel 的请求正文大小限制处于禁用状态。 IIS 已设置限制。
请求正文最小数据速率
MinRequestBodyDataRate
MinResponseDataRate
Kestrel 每秒检查一次数据是否以指定的速率(字节/秒)传入。 如果速率低于最小值,则连接超时。宽限期是 Kestrel 允许客户端将其发送速率提升到最小值的时间量。 在此期间不会检查速率。 宽限期有助于避免最初由于 TCP 慢启动而以较慢速率发送数据的连接中断。
默认的最小速率为 240 字节/秒,包含 5 秒的宽限期。
最小速率也适用于响应。 除了属性和接口名称中具有 RequestBody
或 Response
以外,用于设置请求限制和响应限制的代码相同。
以下示例演示如何在 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);
在中间件中替代每个请求的最低速率限制:
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));
用于 HTTP/2 请求的 HttpContext.Features 中不存在先前示例中引用的 IHttpMinResponseDataRateFeature。 由于协议支持请求多路复用,因此 HTTP/2 通常不支持基于每个请求修改速率限制。 不过,用于 HTTP/2 请求的 HttpContext.Features
中仍存在 IHttpMinRequestBodyDataRateFeature,因为仍可以通过将 IHttpMinResponseDataRateFeature.MinDataRate 设置为 null
(甚至对于 HTTP/2 请求),按请求完全禁用读取速率限制。 对于给定 HTTP/2 请求,尝试读取 IHttpMinRequestBodyDataRateFeature.MinDataRate
或尝试将它设置为除 null
以外的值会导致 NotSupportedException 抛出。
通过 KestrelServerOptions.Limits 配置的服务器范围的速率限制仍适用于 HTTP/1.x 和 HTTP/2 连接。
RequestHeadersTimeout
获取或设置服务器接收请求标头所花费的最大时间量。 默认值为 30 秒。
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 限制
该部分中的限制在 KestrelServerLimits.Http2 上设置。
每个连接的最大流
MaxStreamsPerConnection
限制每个 HTTP/2 连接的并发请求流的数量。 拒绝过多的流。
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
默认值为 100。
HeaderTableSize
HPACK 解码器解压缩 HTTP/2 连接的 HTTP 标头。 HeaderTableSize
限制 HPACK 解码器使用的标头压缩表的大小。 该值以八位字节提供,且必须大于零 (0)。
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.Limits.Http2.HeaderTableSize = 4096;
默认值为 4096。
最大帧大小
MaxFrameSize
表示服务器接收或发送的 HTTP/2 连接帧有效负载的最大允许大小。 该值以八位字节提供,必须介于 2^14 (16,384) 和 2^24-1 (16,777,215) 之间。
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.Limits.Http2.MaxFrameSize = 16384;
默认值为 2^14 (16,384)。
MaxRequestHeaderFieldSize
表示请求标头值的允许的最大大小(用八进制表示)。 此限制适用于名称和值的压缩和未压缩表示形式。 该值必须大于零 (0)。
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
默认值为 8,192。
初始连接窗口大小
InitialConnectionWindowSize
表示服务器一次性缓存的最大请求主体数据大小(每次连接时在所有请求(流)中汇总,以字节为单位)。 请求也受 Http2.InitialStreamWindowSize
限制。 该值必须大于或等于 65,535,并小于 2^31 (2,147,483,648)。
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
默认值为 128 KB (131,072)。
初始流窗口大小
InitialStreamWindowSize
表示服务器针对每个请求(流)的一次性缓存的最大请求主体数据大小(以字节为单位)。 请求也受 InitialConnectionWindowSize
限制。 该值必须大于或等于 65,535,并小于 2^31 (2,147,483,648)。
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
默认值为 96 KB (98,304)。
HTTP/2 保持活动 ping 配置
Kestrel 可以配置为向连接的客户端发送 HTTP/2 ping。 HTTP/2 ping 有多种用途:
使空闲连接保持活动状态。 某些客户端和代理服务器会关闭空闲的连接。 HTTP/2 ping 是对连接执行的活动,可防止空闲连接被关闭。
关闭不正常的连接。 服务器会关闭在配置的时间内客户端未响应保持活动 ping 的连接。
与 HTTP/2 保持活动 ping 关联的配置选项有两个:
KeepAlivePingDelay 是配置 ping 间隔的 TimeSpan。 如果服务器在此时间段内没有收到任何帧,则服务器会向客户端发送保持活动 ping。 将此选项设置为 TimeSpan.MaxValue 时,会禁用保持活动 ping。 默认值为 TimeSpan.MaxValue。
KeepAlivePingTimeout 是配置 ping 超时的 TimeSpan。 如果服务器在此超时期间没有收到任何帧(如响应 ping),则连接将关闭。 将此选项设置为 TimeSpan.MaxValue 时,会禁用保持活动状态超时。 默认值为 20 秒。
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
同步 I/O
AllowSynchronousIO 控制是否允许对请求和响应使用同步 I/O。 默认值为 false
。
大量阻止同步 I/O 的操作可能会导致线程池资源不足,进而导致应用无响应。 仅在使用不支持异步 I/O 的库时,才启用 AllowSynchronousIO
。
以下示例会启用同步 I/O:
webBuilder.ConfigureKestrel(serverOptions =>
serverOptions.AllowSynchronousIO = true;
有关其他 Kestrel 选项和限制的信息,请参阅:
KestrelServerOptions
KestrelServerLimits
ListenOptions