Web sunucusu için ASP.NET Core Kestrel yapılandırma
Web Kestrel sunucusunun, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçenekleri vardır.
çağrısı sonrasında ek yapılandırma sağlamak için ConfigureWebHostDefaults ConfigureKestrel kullanın:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
// Set properties and call methods on options
})
.UseStartup<Startup>();
});
sınıfının özelliği üzerinde Limits kısıtlamalar KestrelServerOptions ayarlayın. Limitsözelliği sınıfının bir örneğini KestrelServerLimits tutar.
Aşağıdaki örneklerde ad alanı Microsoft.AspNetCore.Server.Kestrel.Core kullanılır:
using Microsoft.AspNetCore.Server.Kestrel.Core;
Bu makalenin devamlarında gösterilen Kestrel örneklerde seçenekler C# kodunda yapılandırılır. Kestrelseçenekleri bir yapılandırma sağlayıcısı kullanılarak da ayarlandırabilirsiniz. Örneğin, Dosya Yapılandırma Sağlayıcısı bir veya Kestrel dosyasından appsettings.json yapılandırmayı yük appsettings.{Environment}.json olabilir:
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
},
"DisableStringReuse": true
}
}
Not
KestrelServerOptions ve uç nokta yapılandırması yapılandırma sağlayıcılarından yapılandırılabilir. Kalan Kestrel yapılandırmanın C# kodunda yapılandırılması gerekir.
Aşağıdaki yaklaşımlardan birini kullanın:
içinde Kestrel
Startup.ConfigureServicesyapılandırma:sınıfına bir
IConfigurationörneğiStartupekleme. Aşağıdaki örnekte, özelliğine yeni yapılandırmanın atandığıConfigurationvarsayıldı.içinde,
Startup.ConfigureServicesyapılandırmaKestrelbölümünü Kestrel 'nin yapılandırmasına yükleme: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) { ... } }
Konak Kestrel yapılandırılırken yapılandırma:
içinde,
Program.csyapılandırmaKestrelbölümünü Kestrel 'nin yapılandırmasına yükleme:// 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>(); });
Yukarıdaki yaklaşımların her ikisi de herhangi bir yapılandırma sağlayıcısı ile çalışır.
Genel sınırlar
Canlı tutma zaman aşımı
Keep-alive zaman aşımını alır veya ayarlar. Varsayılan değer 2 dakikadır.
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);
})
En fazla istemci bağlantısı
MaxConcurrentConnections
MaxConcurrentUpgradedConnections
Uygulamanın tamamı için en fazla eşzamanlı açık TCP bağlantısı sayısı aşağıdaki kodla birlikte ayarlanır:
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 veya HTTPS'den başka bir protokole (örneğin, Bir WebSockets isteği üzerinde) yükseltilen bağlantılar için ayrı bir sınır vardır. Bağlantı yükseltildikten sonra sınıra göre MaxConcurrentConnections sayılmaz.
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);
})
En fazla bağlantı sayısı varsayılan olarak sınırsızdır (null).
En büyük istek gövdesi boyutu
Varsayılan en yüksek istek gövdesi boyutu 30.000.000 bayttır ve bu da yaklaşık 28,6 MB'tır.
Bir MVC uygulamasında sınırı geçersiz kılmak ASP.NET Core yaklaşım, özniteliğini bir eylem RequestSizeLimitAttribute yönteminde kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Aşağıdaki örnekte, her istekte uygulama kısıtlamasını nasıl yapılandırabilirsiniz?
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);
})
Ara yazılımda belirli bir istekte ayarı geçersiz kılın:
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));
}
Uygulama isteği okumaya başladıktan sonra istekte sınırı yapılandırıyorsa bir özel durum oluşturur. Özelliğin salt okunur durumda olup bu sınırı yapılandırmak için çok geç olduğunu belirten IsReadOnly MaxRequestBodySize bir özellik vardır.
Bir uygulama, ASP.NET Core Modülü'ASP.NET Core işlem dışı Kestrel bırakılmıştır. IIS zaten sınırı ayarlar.
En düşük istek gövdesi veri hızı
MinRequestBodyDataRate
MinResponseDataRate
Kestrel veriler bayt/saniye cinsinden belirtilen hıza geliyorsa her saniye denetler. Hız en düşük değere düşerse bağlantı zaman out olur. Yetkisiz kullanım süresi, istemcinin gönderme Kestrel oranını en düşük değere kadar artırmasını sağlayan süredir. Bu süre boyunca fiyat denetlenir. Yetkisiz kullanım süresi, TCP'nin yavaş başlaması nedeniyle başlangıçta veri gönderen bağlantıların yavaş bir şekilde bırakılmasından kaçınmaya yardımcı olur.
Varsayılan minimum hız, 5 saniyelik yetkisiz kullanım süresi ile 240 bayt/saniyedir.
Yanıt için de bir minimum hız geçerlidir. İstek sınırını ve yanıt sınırını ayarlamaya yönelik kod, özellik ve arabirim adlarında veya olması RequestBody Response dışında aynıdır.
'de en düşük veri oranlarının nasıl yapılandırıldığından emin olmak için aşağıdaki örnekte yer Program.cs almaktadır:
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);
})
Ara yazılımda istek başına en düşük hız sınırlarını geçersiz kılın:
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));
}
Önceki IHttpMinResponseDataRateFeature örnekte başvurulan, HttpContext.Features HTTP/2 istekleri için içinde mevcut değil. İstek başına hız sınırlarını değiştirmek, protokolün istek çoklama desteği nedeniyle http/2 için genel olarak desteklenmiyor. Ancak, okuma hızı sınırı bir HTTP/2 isteği için bile olarak ayar tarafından istek başına tamamen devre dışı bırakılana kadar IHttpMinRequestBodyDataRateFeature HttpContext.Features IHttpMinResponseDataRateFeature.MinDataRate HTTP/2 istekleri için hala null mevcuttur. Okuma veya bunu dışında bir değere ayarlama denemesi, IHttpMinRequestBodyDataRateFeature.MinDataRate http/2 isteği verilmesine null NotSupportedException neden olur.
aracılığıyla yapılandırılan sunucu genelinde hız sınırları KestrelServerOptions.Limits hem HTTP/1.x hem de HTTP/2 bağlantıları için geçerli olur.
İstek üst bilgileri zaman aşımı
Sunucunun istek üst bilgilerini almak için harcadığı maksimum zamanı alır veya ayarlar. Varsayılan olarak 30 saniyedir.
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 sınırları
Bu bölümdeki sınırlar üzerinde KestrelServerLimits.Http2 ayarlanır.
Bağlantı başına en fazla akış sayısı
HTTP/2 bağlantısı başına eş zamanlı istek akışının sayısını sınırlar. Fazla akışlar reddeder.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Varsayılan değer 100’dür.
Üst bilgi tablosu boyutu
HPACK kod çözücü, HTTP/2 bağlantıları için HTTP üst bilgilerini sıkıştırıyor. HeaderTableSize , HPACK kod çözücüs tarafından kullanılan üst bilgi sıkıştırma tablosu boyutunu sınırlar. Değer sekizli olarak sağlanır ve sıfırdan (0) büyük olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Varsayılan değer 4096'dır.
En büyük çerçeve boyutu
Sunucu tarafından alınan veya gönderilen HTTP/2 bağlantı çerçevesi yükünün izin verilen en büyük boyutunu gösterir. Değer sekizli olarak sağlanmıştır ve 2^14 (16.384) ile 2^24-1 (16.777.215) arasında olması gerekir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16384;
});
Varsayılan değer 2^14 'tir (16.384).
En büyük istek üst bilgisi boyutu
İstek üst bilgisi değerlerinin sekizlileri içinde izin verilen en büyük boyutu gösterir. Bu sınır sıkıştırılmış ve sıkıştırılmamış gösterimlerinde hem ad hem de değer için geçerlidir. Değer sıfırdan (0) büyük olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
Varsayılan değer 8.192'dir.
İlk bağlantı penceresi boyutu
Sunucu arabelleklerinin bağlantı başına tüm istekler (akışlar) arasında toplanmış bayt cinsinden en yüksek istek gövdesi verilerini gösterir. İstekler de ile Http2.InitialStreamWindowSize sınırlıdır. Değer 65.535 değerinden büyük veya bu değere eşit ve 2^31'den (2.147.483.648) küçük olması gerekir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});
Varsayılan değer 128 KB'tır (131.072).
İlk akış penceresi boyutu
İstek (akış) başına bir defada sunucu arabelleklerinin bayt cinsinden en yüksek istek gövdesi verilerini gösterir. İstekler de ile InitialConnectionWindowSize sınırlıdır. Değer 65.535 değerinden büyük veya bu değere eşit ve 2^31'den (2.147.483.648) küçük olması gerekir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});
Varsayılan değer 96 KB'tır (98.304).
HTTP/2 canlı tut ping yapılandırması
Kestrel , bağlı istemcilere HTTP/2 ping'leri gönderecek şekilde yalıtabilirsiniz. HTTP/2 ping'leri birden çok amaca hizmet ediyor:
- Boştaki bağlantıları canlı tutma. Bazı istemciler ve proxy sunucuları boşta olan bağlantıları kapatır. HTTP/2 ping'leri bağlantıda etkinlik olarak kabul edilir ve bağlantının boşta olarak kapatılmalarını önler.
- Sağlıksız bağlantıları kapatın. İstemcinin yapılandırılan süre içinde canlı tutma ping'ine yanıt vermeyen bağlantılar sunucu tarafından kapatılır.
HTTP/2'nin canlı tutma ping'leri ile ilgili iki yapılandırma seçeneği vardır:
- KeepAlivePingDelay , TimeSpan ping aralığını yapılandıran bir'dır. Sunucu, bu süre boyunca herhangi bir kare almasa istemciye bir canlı tutma ping'i gönderir. Bu seçenek olarak ayarlanmışsa, Canlı tut ping'leri devre dışı TimeSpan.MaxValue bırakılır. TimeSpan.MaxValue varsayılan değerdir.
- KeepAlivePingTimeout , TimeSpan ping zaman aşımını yapılandıran bir. Sunucu yanıt ping gibi bir çerçeve almazsa, bu zaman aşımı sırasında bağlantı kapatılır. Bu seçenek olarak ayarlandığında Canlı kalma zaman aşımını devre dışı bırakın TimeSpan.MaxValue . Varsayılan değer 20 saniyedir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromSeconds(60);
});
Diğer seçenekler
Zaman Uyumlu G/Ç
AllowSynchronousIO istek ve yanıt için zaman uyumlu g/ç 'ye izin verilip verilmediğini denetler. false varsayılan değerdir.
Uyarı
Çok sayıda engelleme zaman uyumlu g/ç işlemi, iş parçacığı havuzuna yol açabilir, bu da uygulamanın yanıt vermemesine neden olur. Yalnızca AllowSynchronousIO zaman uyumsuz g/ç desteklemeyen bir kitaplık kullanırken etkinleştirin.
Aşağıdaki örnek, zaman uyumlu g/ç 'yi sunar:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
})
Diğer seçenekler ve sınırlamalar hakkında daha fazla bilgi için Kestrel bkz.: