ASP.NET Core Kestrel Web サーバーのオプションを構成する

Kestrel Web サーバーには、インターネットに接続する展開で特に有効な制約構成オプションがいくつかあります。 Kestrel 構成オプションを構成するには、Program.csConfigureKestrel を呼び出します。

var builder = WebApplication.CreateBuilder(args);

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

KestrelServerOptions.Limits プロパティで制約を設定します。 このプロパティは、KestrelServerLimits クラスのインスタンスを保持しています。

この記事の後半で示す例では、Kestrel オプションが C# コードで構成されています。 Kestrel オプションは、Kestrelを使用して設定することもできます。 たとえば、ファイル構成プロバイダーを使用すると、appsettings.json ファイルまたは appsettings.{Environment}.json ファイルから、 構成を読み込むことができます。

{
  "Kestrel": {
    "Limits": {
      "MaxConcurrentConnections": 100,
      "MaxConcurrentUpgradedConnections": 100
    },
    "DisableStringReuse": true
  }
}

既定では、Kestrel の構成は、事前に構成された構成プロバイダーのセットを使って Kestrel セクションから読み込まれます。 構成プロバイダーの既定のセットについて詳しくは、「既定の構成」をご覧ください。

Note

KestrelServerOptions およびKestrelServerOptionsは、構成プロバイダーから構成できます。 Kestrel の他の構成は、C# コードで設定します。

全般的な制限

Keep-Alive タイムアウト

KeepAliveTimeout は、Keep-Alive タイムアウトを取得または設定します。

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

クライアントの最大接続数

MaxConcurrentConnections は、開く接続の最大数を取得または設定します。

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

MaxConcurrentUpgradedConnections は、開くアップグレードされた接続の最大数を取得または設定します。

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

アップグレードされた接続とは、HTTP から別のプロトコル (WebSocket など) に切り替えられた接続のことです。 接続がアップグレードされた後、それは MaxConcurrentConnections 制限に対してカウントされません。

要求本文の最大サイズ

MaxRequestBodySize は、要求本文の最大許容サイズ (バイト単位) を取得または設定します。

ASP.NET Core MVC アプリでの制限をオーバーライドする方法としては、アクション メソッドに対して RequestSizeLimitAttribute 属性を使用することをお勧めします。

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

次の例では、すべての要求に MaxRequestBodySize を構成します。

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

次の例では、カスタム ミドルウェアで IHttpMaxRequestBodySizeFeature を使って、特定の要求に MaxRequestBodySize を構成します。

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

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

    // ...

    await next(context);
});

アプリで要求の読み取りを開始した後に、要求に対する制限を構成しようとすると、例外がスローされます。 MaxRequestBodySize プロパティを設定しても安全かどうかを調べるには、IHttpMaxRequestBodySizeFeature.IsReadOnly プロパティを使います。

アプリが ASP.NET Core Module の背後でアウト プロセスとして実行されていると、制限は IIS によって設定され、Kestrel の要求本文サイズの制限は無効になります。

要求本文の最小レート

Kestrel はデータが指定のレート (バイト数/秒) で到着しているかどうかを毎秒チェックします。 レートが最小値を下回った場合は接続がタイムアウトになります。猶予期間とは、クライアントによって送信レートを最低ラインまで引き上げられるのを、Kestrel が待機する時間のことです。 この期間中、レートはチェックされません。 猶予期間を設定すると、TCP のスロースタートが原因で最初のデータ送信が低速レートで行われる接続の切断を回避することができます。 最小レートは応答にも適用されます。

MinRequestBodyDataRate は、要求本文の最小データ速度 (バイト/秒) を取得または設定します。 MinResponseDataRate は、応答の最小データ速度 (バイト/秒) を取得または設定します。

次の例では、すべての要求に MinRequestBodyDataRateMinResponseDataRate を構成します。

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

次の例では、カスタム ミドルウェアで IHttpMinRequestBodyDataRateFeatureIHttpMinResponseDataRateFeature を使って、特定の要求に MinRequestBodyDataRateMinResponseDataRate を構成します。

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 は、HTTP/2 要求の HttpContext.Features には存在しません。 要求の多重化がプロトコルでサポートされているため、要求ごとにレート制限を変更することは、一般的に HTTP/2 ではサポートされていません。 一方、IHttpMinRequestBodyDataRateFeature は HTTP/2 要求の HttpContext.Features にまだ存在します。これは、HTTP/2 要求であっても、IHttpMinResponseDataRateFeature.MinDataRatenull に設定することにより、読み取り速度の制限を要求ごとに "完全に無効" にできるためです。 IHttpMinRequestBodyDataRateFeature.MinDataRate を読み取ろうとしたり、null 以外の値に設定しようとしたりすると、HTTP/2 要求で NotSupportedException が発生します。

KestrelServerOptions.Limits で構成したサーバー全体のレート制限は、引き続き HTTP/1.x と HTTP/2 の両方の接続に適用されます。

要求ヘッダー タイムアウト

RequestHeadersTimeout は、サーバーで要求ヘッダーの受信にかかる時間の最大値を取得または設定します。

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

HTTP/2 制限

このセクションの制限は、KestrelServerLimits.Http2 に設定されています。

接続ごとの最大ストリーム

HTTP/2 接続ごとの同時要求ストリームの数は、MaxStreamsPerConnection によって制限されます。 余分なストリームは拒否されます。

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

ヘッダー テーブルのサイズ

HeaderTableSize は、サーバー上の HPACK エンコーダーとデコーダーが使用できる、ヘッダー圧縮テーブルのサイズ (オクテット単位) を制限します。 HTTP/2 接続では、HTTP ヘッダーは HPACK デコーダーによって圧縮解除されます。

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

最大フレーム サイズ

MaxFrameSize は、受信できる最大フレーム ペイロードのサイズ (オクテット単位) を示します。

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

最大要求ヘッダー サイズ

MaxRequestHeaderFieldSize は、要求ヘッダー フィールド シーケンスの最大許容サイズを示します。 この制限は、名前と値のシーケンスの圧縮表現と非圧縮表現の両方に適用されます。

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

初期接続ウィンドウ サイズ

InitialConnectionWindowSize は、サーバーが一度に受信してバッファーに格納する、接続ごとにすべての要求 (ストリーム) について集計される要求本文のデータの量を示します。

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

要求は InitialStreamWindowSize による制限も受けます。

初期ストリーム ウィンドウ サイズ

InitialStreamWindowSize は、サーバーがストリームごとに一度に受信してバッファーに格納する要求本文のデータの量を示します。

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

要求は InitialConnectionWindowSize による制限も受けます。

HTTP/2 キープ アライブ ping 構成

Kestrel は、接続されているクライアントに HTTP/2 ping を送信するように構成できます。 HTTP/2 ping は複数の目的で機能します。

  • アイドル状態の接続を維持します。 一部のクライアントとプロキシ サーバーでは、アイドル状態の接続が閉じられます。 HTTP/2 ping は接続におけるアクティビティと見なされ、接続がアイドル状態として閉じられるのを防ぎます。
  • 異常な接続を閉じます。 構成された時間でキープ アライブ ping にクライアントが応答しない接続はサーバーによって閉じられます。

HTTP/2 キープ アライブ ping に関連する 2 つの構成オプション:

  • KeepAlivePingDelay は、ping 間隔を構成する TimeSpan です。 この時間内にフレームが受信されない場合、サーバーからクライアントにキープ アライブ ping が送信されます。 このオプションが TimeSpan.MaxValue に設定されているとき、キープ アライブ ping は無効になります。
  • KeepAlivePingTimeout は、ping タイムアウトを構成する TimeSpan です。 このタイムアウト内でサーバーが応答 ping など、いかなるフレームも受信しない場合、接続は閉じられます。 このオプションが TimeSpan.MaxValue に設定されているとき、キープ アライブ タイムアウトは無効になります。

次の例では、KeepAlivePingDelayKeepAlivePingTimeout を設定します。

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

その他のオプション

同期 I/O

AllowSynchronousIO を使うと、要求と応答に対して同期 I/O を許可するかどうかを制御できます。

警告

ブロッキング同期 I/O 操作の回数が多いと、スレッド プールの不足を招き、アプリが応答しなくなる可能性があります。 非同期 I/O をサポートしていないライブラリを使用する場合にのみ AllowSynchronousIO を有効にしてください。

同期 I/O を有効にする例を次に示します。

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

Kestrel のその他のオプションと制限については、以下をご覧ください。

Kestrel Web サーバーには、インターネットに接続する展開で特に有効な制約構成オプションがいくつかあります。

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": {
    "Limits": {
      "MaxConcurrentConnections": 100,
      "MaxConcurrentUpgradedConnections": 100
    },
    "DisableStringReuse": true
  }
}

Note

KestrelServerOptions およびKestrelServerOptionsは、構成プロバイダーから構成できます。 残りの Kestrel 構成は、C# コードで構成する必要があります。

次の方法のいずれかを使用します。

  • Startup.ConfigureServices で Kestrel を構成します。

    1. IConfiguration のインスタンスを Startup クラスに挿入します。 以下の例では、挿入された構成が Configuration プロパティに割り当てられることを前提としています。

    2. 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>();
            });
    

上記の方法はいずれも、任意の構成プロバイダーで使用できます。

全般的な制限

Keep-Alive タイムアウト

KeepAliveTimeout

Keep-Alive タイムアウトを取得するか、設定します。 既定値は 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 から別のプロトコルにアップグレードされた接続については別個の制限があります (WebSockets 要求に関する制限など)。 接続がアップグレードされた後、それは 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));
    }

アプリが要求の読み取りを開始した後で、要求に対する制限をアプリで構成すると、例外がスローされます。 MaxRequestBodySize プロパティが読み取り専用状態にある (制限を構成するには遅すぎる) かどうかを示す IsReadOnly プロパティがあります。

ASP.NET Core Module の背後で、アプリがアウト プロセスで実行される場合は、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));
    }

前のサンプルで参照した IHttpMinResponseDataRateFeature は、HTTP/2 要求の HttpContext.Features には存在しません。 要求の多重化がプロトコルでサポートされているため、要求ごとにレート制限を変更することは、一般的に HTTP/2 ではサポートされていません。 ただし、IHttpMinRequestBodyDataRateFeature は引き続き現在の HTTP/2 要求の HttpContext.Features です。これは、HTTP/2 要求に対してであっても、IHttpMinResponseDataRateFeature.MinDataRatenull に設定すれば、読み取りのレート制限を要求ごとに "すべて無効" にできるためです。 IHttpMinRequestBodyDataRateFeature.MinDataRate を読み取ろうとしたり、null 以外の値に設定しようとしたりすると、HTTP/2 要求を指定した 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

HTTP/2 接続では、HTTP ヘッダーは HPACK デコーダーによって圧縮解除されます。 HPACK デコーダーが使用するヘッダー圧縮テーブルのサイズは HeaderTableSize によって制限されます。 値はオクテット単位で指定し、ゼロ (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 に関連する 2 つの構成オプション:

  • 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 のその他のオプションと制限については、以下をご覧ください。