Bagikan melalui


Mengonfigurasi opsi untuk server web ASP.NET Core Kestrel

Server Kestrel web memiliki opsi konfigurasi batasan yang sangat berguna dalam penyebaran yang terhubung ke Internet. Untuk mengonfigurasi Kestrel opsi konfigurasi, panggil ConfigureKestrel di Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

Atur batasan pada KestrelServerOptions.Limits properti . Properti ini menyimpan instans KestrelServerLimits kelas.

Batas umum

Batas waktu tetap hidup

KeepAliveTimeout mendapatkan atau mengatur batas waktu tetap hidup:

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

Batas waktu ini tidak diberlakukan ketika debugger dilampirkan ke Kestrel proses.

Koneksi klien maksimum

MaxConcurrentConnections mendapatkan atau mengatur jumlah maksimum koneksi terbuka:

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

MaxConcurrentUpgradedConnections mendapatkan atau mengatur jumlah maksimum koneksi yang terbuka dan ditingkatkan:

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

Koneksi yang ditingkatkan adalah koneksi yang telah dialihkan dari HTTP ke protokol lain, seperti WebSocket. Setelah koneksi ditingkatkan, koneksi tidak dihitung terhadap MaxConcurrentConnections batas.

Ukuran isi permintaan maksimum

MaxRequestBodySize mendapatkan atau mengatur ukuran maksimum yang diizinkan dari isi permintaan apa pun dalam byte.

Pendekatan yang disarankan untuk mengambil alih batas dalam aplikasi ASP.NET Core MVC adalah dengan menggunakan RequestSizeLimitAttribute atribut pada metode tindakan:

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

Contoh berikut mengonfigurasi MaxRequestBodySize untuk semua permintaan:

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

Contoh berikut mengonfigurasi MaxRequestBodySize untuk permintaan tertentu menggunakan IHttpMaxRequestBodySizeFeature di middleware kustom:

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

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

    // ...

    await next(context);
});

Jika aplikasi mencoba mengonfigurasi batas pada permintaan setelah mulai membaca permintaan, pengecualian akan dilemparkan. Ue IHttpMaxRequestBodySizeFeature.IsReadOnly properti untuk memeriksa apakah aman untuk mengatur MaxRequestBodySize properti.

Saat aplikasi kehabisan proses di belakang Modul ASP.NET Core, IIS menetapkan batas dan Kestrelbatas ukuran isi permintaan dinonaktifkan.

Tingkat data isi permintaan minimum

Kestrel memeriksa setiap detik jika data tiba pada tingkat yang ditentukan dalam byte/detik. Jika tingkat turun di bawah minimum, koneksi akan kehabisan waktu. Masa tenggang adalah jumlah waktu Kestrel yang memungkinkan klien untuk meningkatkan tingkat pengirimannya hingga minimum. Tarif tidak diperiksa selama waktu tersebut. Masa tenggang membantu menghindari hilangnya koneksi yang awalnya mengirim data pada laju lambat karena mulai lambat TCP. Tarif minimum juga berlaku untuk respons.

MinRequestBodyDataRate mendapatkan atau mengatur tingkat data minimum isi permintaan dalam byte/detik. MinResponseDataRate mendapatkan atau mengatur tingkat data minimum respons dalam byte/detik.

Contoh berikut mengonfigurasi MinRequestBodyDataRate dan MinResponseDataRate untuk semua permintaan:

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

Contoh berikut mengonfigurasi MinRequestBodyDataRate dan MinResponseDataRate untuk permintaan tertentu menggunakan IHttpMinRequestBodyDataRateFeature dan IHttpMinResponseDataRateFeature dalam middleware kustom:

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 tidak ada untuk HttpContext.Features permintaan HTTP/2. Mengubah batas tarif berdasarkan per permintaan umumnya tidak didukung untuk HTTP/2 karena dukungan protokol untuk multipleks permintaan. Namun, IHttpMinRequestBodyDataRateFeature masih ada untuk HttpContext.Features permintaan HTTP/2, karena batas tingkat baca masih dapat dinonaktifkan sepenuhnya berdasarkan per permintaan dengan mengatur IHttpMinResponseDataRateFeature.MinDataRate ke null, bahkan untuk permintaan HTTP/2. Mencoba membaca IHttpMinRequestBodyDataRateFeature.MinDataRate atau mencoba mengaturnya ke nilai selain null menghasilkan NotSupportedException permintaan HTTP/2.

Batas laju di seluruh server yang dikonfigurasi melalui KestrelServerOptions.Limits masih berlaku untuk koneksi HTTP/1.x dan HTTP/2.

Batas waktu header permintaan

RequestHeadersTimeout mendapatkan atau mengatur jumlah maksimum waktu yang dihabiskan server untuk menerima header permintaan:

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

Batas waktu ini tidak diberlakukan ketika debugger dilampirkan ke Kestrel proses.

Batas HTTP/2

Batasan di bagian ini diatur pada KestrelServerLimits.Http2.

Aliran maksimum per koneksi

MaxStreamsPerConnection membatasi jumlah aliran permintaan bersamaan per koneksi HTTP/2. Aliran berlebih ditolak:

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

Ukuran tabel header

HeaderTableSize membatasi ukuran tabel kompresi header, dalam oktet, encoder dan dekoder HPACK di server dapat digunakan. Dekoder HPACK mendekompresi header HTTP untuk koneksi HTTP/2:

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

Ukuran bingkai maksimum

MaxFrameSize menunjukkan ukuran payload bingkai terbesar yang diizinkan untuk diterima, dalam oktet:

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

Ukuran header permintaan maksimum

MaxRequestHeaderFieldSize menunjukkan ukuran maksimum yang diizinkan dari urutan bidang header permintaan. Batas ini berlaku untuk urutan nama dan nilai dalam representasi terkompresi dan tidak dikompresi:

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

Ukuran jendela koneksi awal

InitialConnectionWindowSize menunjukkan berapa banyak data isi permintaan yang bersedia diterima server dan buffer pada satu waktu yang dikumpulkan di semua permintaan (aliran) per koneksi:

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

Permintaan juga dibatasi oleh InitialStreamWindowSize.

Ukuran jendela aliran awal

InitialStreamWindowSize menunjukkan berapa banyak data isi permintaan yang bersedia diterima server dan buffer pada satu waktu per aliran:

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

Permintaan juga dibatasi oleh InitialConnectionWindowSize.

HTTP/2 tetap hidupkan konfigurasi ping

Kestrel dapat dikonfigurasi untuk mengirim ping HTTP/2 ke klien yang terhubung. Ping HTTP/2 melayani beberapa tujuan:

  • Menjaga koneksi diam tetap hidup. Beberapa klien dan server proksi menutup koneksi yang menganggur. Ping HTTP/2 dianggap sebagai aktivitas pada koneksi dan mencegah koneksi ditutup sebagai menganggur.
  • Tutup koneksi yang tidak sehat. Koneksi di mana klien tidak merespons ping tetap hidup dalam waktu yang dikonfigurasi ditutup oleh server.

Ada dua opsi konfigurasi yang terkait dengan HTTP/2 ping tetap hidup:

  • KeepAlivePingDelay adalah TimeSpan yang mengonfigurasi interval ping. Server mengirimkan ping tetap hidup ke klien jika tidak menerima bingkai apa pun untuk periode waktu ini. Ping tetap hidup dinonaktifkan ketika opsi ini diatur ke TimeSpan.MaxValue.
  • KeepAlivePingTimeout adalah TimeSpan yang mengonfigurasi batas waktu ping. Jika server tidak menerima bingkai apa pun, seperti ping respons, selama batas waktu ini, maka koneksi ditutup. Batas waktu tetap hidup dinonaktifkan ketika opsi ini diatur ke TimeSpan.MaxValue.

Contoh berikut menetapkan KeepAlivePingDelay dan KeepAlivePingTimeout:

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

Opsi lain

I/O Sinkron

AllowSynchronousIO mengontrol apakah I/O sinkron diizinkan untuk permintaan dan respons.

Peringatan

Sejumlah besar pemblokiran operasi I/O sinkron dapat menyebabkan kelaparan kumpulan utas, yang membuat aplikasi tidak responsif. Hanya aktifkan AllowSynchronousIO saat menggunakan pustaka yang tidak mendukung I/O asinkron.

Contoh berikut mengaktifkan I/O sinkron:

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

Untuk informasi tentang opsi dan batasan lainnya Kestrel , lihat:

Perilaku dengan debugger terlampir

Batas waktu habis dan tarif tertentu tidak diberlakukan saat debugger dilampirkan ke Kestrel proses. Untuk informasi selengkapnya, lihat Perilaku dengan debugger terlampir.

Server Kestrel web memiliki opsi konfigurasi batasan yang sangat berguna dalam penyebaran yang terhubung ke Internet.

Untuk menyediakan lebih banyak konfigurasi setelah memanggil ConfigureWebHostDefaults, gunakan ConfigureKestrel:

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

Atur batasan pada Limits properti KestrelServerOptions kelas. Properti Limits menyimpan instans KestrelServerLimits kelas.

Contoh berikut menggunakan Microsoft.AspNetCore.Server.Kestrel.Core namespace layanan:

using Microsoft.AspNetCore.Server.Kestrel.Core;

Catatan

KestrelServerOptions dan konfigurasi titik akhir dapat dikonfigurasi dari penyedia konfigurasi. Konfigurasi yang tersisa Kestrel harus dikonfigurasi dalam kode C#.

Batas umum

Batas waktu tetap hidup

KeepAliveTimeout

Mendapatkan atau mengatur batas waktu tetap hidup. Default ke 2 menit.

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

Koneksi klien maksimum

MaxConcurrentConnections
MaxConcurrentUpgradedConnections

Jumlah maksimum koneksi TCP terbuka bersamaan dapat diatur untuk seluruh aplikasi dengan kode berikut:

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

Ada batas terpisah untuk koneksi yang telah ditingkatkan dari HTTP atau HTTPS ke protokol lain (misalnya, pada permintaan WebSockets). Setelah koneksi ditingkatkan, koneksi tidak dihitung terhadap MaxConcurrentConnections batas.

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

Jumlah maksimum koneksi tidak terbatas (null) secara default.

Ukuran isi permintaan maksimum

MaxRequestBodySize

Ukuran isi permintaan maksimum default adalah 30.000.000 byte, yaitu sekitar 28,6 MB.

Pendekatan yang disarankan untuk mengambil alih batas dalam aplikasi ASP.NET Core MVC adalah dengan menggunakan RequestSizeLimitAttribute atribut pada metode tindakan:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Contoh berikut menunjukkan cara mengonfigurasi batasan untuk aplikasi pada setiap permintaan:

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

Ambil alih pengaturan pada permintaan tertentu di 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));
    }

Pengecualian dilemparkan jika aplikasi mengonfigurasi batas pada permintaan setelah aplikasi mulai membaca permintaan. Ada IsReadOnly properti yang menunjukkan apakah MaxRequestBodySize properti dalam status baca-saja, yang berarti terlambat untuk mengonfigurasi batas.

Saat aplikasi kehabisan proses di belakang ASP.NET Core Module, Kestrelbatas ukuran isi permintaan dinonaktifkan. IIS sudah menetapkan batas.

Tingkat data isi permintaan minimum

MinRequestBodyDataRate
MinResponseDataRate

Kestrel memeriksa setiap detik jika data tiba pada tingkat yang ditentukan dalam byte/detik. Jika tingkat turun di bawah minimum, koneksi akan kehabisan waktu. Masa tenggang adalah jumlah waktu Kestrel yang memungkinkan klien untuk meningkatkan tingkat pengirimannya hingga minimum. Tarif tidak diperiksa selama waktu tersebut. Masa tenggang membantu menghindari hilangnya koneksi yang awalnya mengirim data pada laju lambat karena mulai lambat TCP.

Tingkat minimum default adalah 240 byte/detik dengan masa tenggang 5 detik.

Tarif minimum juga berlaku untuk respons. Kode untuk mengatur batas permintaan dan batas respons sama kecuali untuk memiliki RequestBody atau Response dalam nama properti dan antarmuka.

Berikut adalah contoh yang menunjukkan cara mengonfigurasi tarif data minimum di 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);
})

Ambil alih batas tarif minimum per permintaan di 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));
    }

Yang IHttpMinResponseDataRateFeature dirujuk dalam sampel sebelumnya tidak ada untuk HttpContext.Features permintaan HTTP/2. Mengubah batas tarif berdasarkan per permintaan umumnya tidak didukung untuk HTTP/2 karena dukungan protokol untuk multipleks permintaan. Namun, IHttpMinRequestBodyDataRateFeature masih ada HttpContext.Features untuk permintaan HTTP/2, karena batas tingkat baca masih dapat dinonaktifkan sepenuhnya berdasarkan per permintaan dengan mengatur IHttpMinResponseDataRateFeature.MinDataRate ke null bahkan untuk permintaan HTTP/2. Mencoba membaca IHttpMinRequestBodyDataRateFeature.MinDataRate atau mencoba mengaturnya ke nilai selain null akan mengakibatkan NotSupportedException dilemparkan dengan permintaan HTTP/2.

Batas laju di seluruh server yang dikonfigurasi melalui KestrelServerOptions.Limits masih berlaku untuk koneksi HTTP/1.x dan HTTP/2.

Batas waktu header permintaan

RequestHeadersTimeout

Mendapatkan atau mengatur jumlah maksimum waktu yang dihabiskan server untuk menerima header permintaan. Default ke 30 detik.

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

Batas HTTP/2

Batasan di bagian ini diatur pada KestrelServerLimits.Http2.

Aliran maksimum per koneksi

MaxStreamsPerConnection

Membatasi jumlah aliran permintaan bersamaan per koneksi HTTP/2. Aliran berlebih ditolak.

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

Nilai default adalah 100.

Ukuran tabel header

HeaderTableSize

Dekoder HPACK mendekompresi header HTTP untuk koneksi HTTP/2. HeaderTableSize membatasi ukuran tabel kompresi header yang digunakan dekoder HPACK. Nilai disediakan dalam oktet dan harus lebih besar dari nol (0).

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

Nilai defaultnya adalah 4096.

Ukuran bingkai maksimum

MaxFrameSize

Menunjukkan ukuran maksimum yang diizinkan dari payload bingkai koneksi HTTP/2 yang diterima atau dikirim oleh server. Nilai disediakan dalam oktet dan harus antara 2^14 (16.384) dan 2^24-1 (16.777.215).

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

Nilai defaultnya adalah 2^14 (16.384).

Ukuran header permintaan maksimum

MaxRequestHeaderFieldSize

Menunjukkan ukuran maksimum yang diizinkan dalam oktet nilai header permintaan. Batas ini berlaku untuk nama dan nilai dalam representasi terkompresi dan tidak dikompresi. Nilai harus lebih besar dari nol (0).

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

Nilai defaultnya adalah 8.192.

Ukuran jendela koneksi awal

InitialConnectionWindowSize

Menunjukkan data isi permintaan maksimum dalam byte buffer server pada satu waktu, dikumpulkan di semua permintaan (aliran) per koneksi. Permintaan juga dibatasi oleh Http2.InitialStreamWindowSize. Nilai harus lebih besar dari atau sama dengan 65.535 dan kurang dari 2^31 (2.147.483.648).

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

Nilai defaultnya adalah 128 KB (131.072).

Ukuran jendela aliran awal

InitialStreamWindowSize

Menunjukkan data isi permintaan maksimum dalam byte buffer server pada satu waktu per permintaan (streaming). Permintaan juga dibatasi oleh InitialConnectionWindowSize. Nilai harus lebih besar dari atau sama dengan 65.535 dan kurang dari 2^31 (2.147.483.648).

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

Nilai defaultnya adalah 96 KB (98.304).

HTTP/2 tetap hidupkan konfigurasi ping

Kestrel dapat dikonfigurasi untuk mengirim ping HTTP/2 ke klien yang terhubung. Ping HTTP/2 melayani beberapa tujuan:

  • Menjaga koneksi diam tetap hidup. Beberapa klien dan server proksi menutup koneksi yang menganggur. Ping HTTP/2 dianggap sebagai aktivitas pada koneksi dan mencegah koneksi ditutup sebagai menganggur.
  • Tutup koneksi yang tidak sehat. Koneksi di mana klien tidak merespons ping tetap hidup dalam waktu yang dikonfigurasi ditutup oleh server.

Ada dua opsi konfigurasi yang terkait dengan HTTP/2 ping tetap hidup:

  • KeepAlivePingDelay adalah TimeSpan yang mengonfigurasi interval ping. Server mengirimkan ping tetap hidup ke klien jika tidak menerima bingkai apa pun untuk periode waktu ini. Ping tetap hidup dinonaktifkan ketika opsi ini diatur ke TimeSpan.MaxValue. Nilai defaultnya adalah TimeSpan.MaxValue.
  • KeepAlivePingTimeout adalah TimeSpan yang mengonfigurasi batas waktu ping. Jika server tidak menerima bingkai apa pun, seperti ping respons, selama batas waktu ini, maka koneksi ditutup. Batas waktu tetap hidup dinonaktifkan ketika opsi ini diatur ke TimeSpan.MaxValue. Nilai defaultnya adalah 20 detik.
webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
    serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});

Opsi lain

I/O Sinkron

AllowSynchronousIO mengontrol apakah I/O sinkron diizinkan untuk permintaan dan respons. Nilai defaultnya adalah false.

Peringatan

Sejumlah besar pemblokiran operasi I/O sinkron dapat menyebabkan kelaparan kumpulan utas, yang membuat aplikasi tidak responsif. Hanya aktifkan AllowSynchronousIO saat menggunakan pustaka yang tidak mendukung I/O asinkron.

Contoh berikut mengaktifkan I/O sinkron:

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

Untuk informasi tentang opsi dan batasan lainnya Kestrel , lihat: