Mengonfigurasi opsi untuk server web ASP.NET Core Kestrel
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.
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
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
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
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
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
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
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
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
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
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:
ASP.NET Core