ASP.NET Core Kestrel web sunucusu seçeneklerini yapılandırma
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Web Kestrel sunucusu, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçeneklerine sahiptir. Yapılandırma seçeneklerini yapılandırmak Kestrel için çağrısı ConfigureKestrel yapın Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
// ...
});
özelliğinde KestrelServerOptions.Limits kısıtlamaları ayarlayın. Bu özellik sınıfının bir örneğini barındırıyor KestrelServerLimits .
Genel sınırlar
Etkin tutma zaman aşımı
KeepAliveTimeoutetkin tutma zaman aşımını alır veya ayarlar:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});
Bu zaman aşımı, işleme bir hata ayıklayıcı eklendiğinde Kestrel uygulanmaz.
En fazla istemci bağlantısı
MaxConcurrentConnections açık bağlantı sayısı üst sınırını alır veya ayarlar:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
});
MaxConcurrentUpgradedConnections açık, yükseltilmiş bağlantı sayısı üst sınırını alır veya ayarlar:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
});
Yükseltilmiş bağlantı, HTTP'den WebSockets gibi başka bir protokole geçirilmiş bağlantıdır. Bağlantı yükseltildikten sonra sınıra MaxConcurrentConnections
göre sayılmaz.
Maksimum istek gövdesi boyutu
MaxRequestBodySize herhangi bir istek gövdesinin izin verilen en büyük boyutunu bayt cinsinden alır veya ayarlar.
ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yaklaşım, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:
[RequestSizeLimit(100_000_000)]
public IActionResult Get()
Aşağıdaki örnek tüm istekler için yapılandırılır MaxRequestBodySize
:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxRequestBodySize = 100_000_000;
});
Aşağıdaki örnek, özel ara yazılımda kullanarak IHttpMaxRequestBodySizeFeature belirli bir istek için yapılandırılırMaxRequestBodySize
:
app.Use(async (context, next) =>
{
var httpMaxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();
if (httpMaxRequestBodySizeFeature is not null)
httpMaxRequestBodySizeFeature.MaxRequestBodySize = 10 * 1024;
// ...
await next(context);
});
Uygulama, isteği okumaya başladıktan sonra bir istekte sınırı yapılandırmaya çalışırsa, bir özel durum oluşturulur. Özelliği ayarlamanın IHttpMaxRequestBodySizeFeature.IsReadOnly güvenli olup olmadığını denetlemek için özelliğini ue MaxRequestBodySize
.
Bir uygulama ASP.NET Çekirdek Modülü arkasında işlem dışı kaldığında, IIS sınırı ayarlar ve Kestrelistek gövdesi boyut sınırı devre dışı bırakılır.
En düşük istek gövdesi veri hızı
Kestrel veriler belirtilen hızda bayt/saniye cinsinden geliyorsa her saniyeyi denetler. Hız minimum değerin altına düşerse bağlantı zaman aşımına uğradı. Yetkisiz kullanım süresi, istemcinin gönderme oranını en düşük değere kadar artırmasına izin veren süredir Kestrel . Bu süre boyunca oran denetlenmiyor. Yetkisiz kullanım süresi, TCP yavaş başlatması nedeniyle başlangıçta yavaş hızda veri gönderen bağlantıların bırakılmasını önlemeye yardımcı olur. Yanıt için en düşük oran da geçerlidir.
MinRequestBodyDataRate istek gövdesi en düşük veri hızını bayt/saniye cinsinden alır veya ayarlar. MinResponseDataRate bayt/saniye cinsinden yanıt en düşük veri hızını alır veya ayarlar.
Aşağıdaki örnekte ve tüm istekler MinRequestBodyDataRate
MinResponseDataRate
için yapılandırılır:
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));
});
Aşağıdaki örnek, özel ara yazılımı kullanarak IHttpMinRequestBodyDataRateFeature ve MinResponseDataRate
kullanarak belirli bir istek için ve IHttpMinResponseDataRateFeature yapılandırılırMinRequestBodyDataRate
:
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 istekleri için içinde HttpContext.Features yok. Protokolün istek çoğullama desteği nedeniyle istek başına hız sınırlarının değiştirilmesi GENELLIKLE HTTP/2 için desteklenmez. Ancak, IHttpMinRequestBodyDataRateFeature
okuma hızı sınırı bir HTTP/2 isteği için bile olarak ayarlanarak null
IHttpMinResponseDataRateFeature.MinDataRate istek başına tamamen devre dışı bırakılabildiğinden, http/2 istekleri için hala içinde bulunurHttpContext.Features
. HTTP/2 istekleri için bir sonucu NotSupportedException dışında null
bir değere ayarlamaya veya okumaya IHttpMinRequestBodyDataRateFeature.MinDataRate
çalışır.
aracılığıyla KestrelServerOptions.Limits yapılandırılan sunucu genelinde hız sınırları, hem HTTP/1.x hem de HTTP/2 bağlantılarına uygulanır.
İstek üst bilgileri zaman aşımı
RequestHeadersTimeout sunucunun istek üst bilgilerini almak için harcadığı maksimum süreyi alır veya ayarlar:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
Bu zaman aşımı, işleme bir hata ayıklayıcı eklendiğinde Kestrel uygulanmaz.
HTTP/2 sınırları
Bu bölümdeki sınırlar üzerinde KestrelServerLimits.Http2ayarlanır.
Bağlantı başına en fazla akış sayısı
MaxStreamsPerConnection HTTP/2 bağlantısı başına eşzamanlı istek akışlarının sayısını sınırlar. Fazla akışlar reddedilir:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Üst bilgi tablosu boyutu
HeaderTableSize üst bilgi sıkıştırma tablolarının boyutunu sınırlar; sekizli kümelerde, sunucudaki HPACK kodlayıcı ve kod çözücü kullanabilir. HPACK kod çözücüsü HTTP/2 bağlantıları için HTTP üst bilgilerini açar:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Maksimum çerçeve boyutu
MaxFrameSize sekizli kümelerde alınmasına izin verilen en büyük çerçeve yükünün boyutunu gösterir:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16_384;
});
İstek üst bilgisi boyutu üst sınırı
MaxRequestHeaderFieldSize bir istek üst bilgisi alan dizisinin izin verilen en büyük boyutunu gösterir. Bu sınır, sıkıştırılmış ve sıkıştırılmamış gösterimlerindeki hem ad hem de değer dizileri için geçerlidir:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
İlk bağlantı penceresi boyutu
InitialConnectionWindowSize sunucunun, bağlantı başına tüm istekler (akışlar) arasında toplanmış bir zamanda ne kadar istek gövdesi verisi almak ve arabelleğe almak istediğini gösterir:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131_072;
});
İstekler ile de sınırlıdır InitialStreamWindowSize
.
İlk akış penceresi boyutu
InitialStreamWindowSize sunucunun akış başına bir kerede ne kadar istek gövdesi verisi almak ve arabelleğe almak istediğini gösterir:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98_304;
});
İstekler ile de sınırlıdır InitialConnectionWindowSize
.
HTTP/2 canlı tutma ping yapılandırması
Kestrel bağlı istemcilere HTTP/2 ping'leri gönderecek şekilde yapılandırılabilir. HTTP/2 pingleri birden çok amaca hizmet eder:
- Boşta kalan bağlantıları canlı tutun. Bazı istemciler ve proxy sunucuları boşta olan bağlantıları kapatır. HTTP/2 ping'leri bir bağlantıdaki etkinlik olarak kabul edilir ve bağlantının boşta olarak kapatılmasını önler.
- İyi durumda olmayan bağlantıları kapatın. İstemcinin yapılandırılan süre içinde canlı tutma ping'ine yanıt vermediği bağlantılar sunucu tarafından kapatılır.
HTTP/2 etkin tutma ping'leriyle ilgili iki yapılandırma seçeneği vardır:
- KeepAlivePingDelay , ping aralığını yapılandıran bir TimeSpan değerdir. Sunucu, bu süre boyunca herhangi bir çerçeve almazsa istemciye canlı tutma ping'i gönderir. Bu seçenek olarak ayarlandığında TimeSpan.MaxValueCanlı tut ping'leri devre dışı bırakılır.
- KeepAlivePingTimeout , ping zaman aşımını yapılandıran bir TimeSpan öğedir. Sunucu bu zaman aşımı sırasında yanıt ping'i gibi herhangi bir çerçeve almazsa bağlantı kapatılır. Bu seçenek olarak ayarlandığında TimeSpan.MaxValueEtkin tut zaman aşımı devre dışı bırakılır.
Aşağıdaki örnek kümeleri KeepAlivePingDelay
ve KeepAlivePingTimeout
:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.KeepAlivePingDelay = TimeSpan.FromSeconds(30);
serverOptions.Limits.Http2.KeepAlivePingTimeout = TimeSpan.FromMinutes(1);
});
Diğer seçenekler
Zaman Uyumlu G/Ç
AllowSynchronousIO istek ve yanıt için zaman uyumlu G/Ç'ye izin verilip verilmeyeceğini denetler.
Uyarı
Çok sayıda zaman uyumlu G/Ç işleminin engellenmesi iş parçacığı havuzu aç kalmasına neden olabilir ve bu da uygulamanın yanıt vermemesine neden olabilir. Yalnızca zaman uyumsuz G/Ç'yi desteklemeyen bir kitaplık kullanırken etkinleştirin AllowSynchronousIO
.
Aşağıdaki örnek zaman uyumlu G/Ç'yi etkinleştirir:
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
});
Diğer Kestrel seçenekler ve sınırlar hakkında bilgi için bkz:
Hata ayıklayıcı eklenmiş davranış
Hata ayıklayıcı bir işleme eklendiğinde Kestrel belirli zaman aşımları ve hız sınırları uygulanmaz. Daha fazla bilgi için bkz . Hata ayıklayıcı eklenmiş davranış.
Web Kestrel sunucusu, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçeneklerine sahiptir.
çağrısı ConfigureWebHostDefaultsyaptıktan sonra daha fazla yapılandırma sağlamak için kullanın ConfigureKestrel:
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 Limits özelliğinde KestrelServerOptions kısıtlamalar ayarlayın. özelliği sınıfının Limits
bir örneğini barındırıyor KestrelServerLimits .
Aşağıdaki örneklerde ad alanı Microsoft.AspNetCore.Server.Kestrel.Core kullanılır:
using Microsoft.AspNetCore.Server.Kestrel.Core;
Not
KestrelServerOptions ve uç nokta yapılandırması, yapılandırma sağlayıcılarından yapılandırılabilir. Kalan Kestrel yapılandırma C# kodunda yapılandırılmalıdır.
Genel sınırlar
Etkin tutma zaman aşımı
Etkin tutma 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 ayarlanabilir:
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 yükseltilen bağlantılar için ayrı bir sınır vardır (örneğin, bir WebSockets isteğinde). Bağlantı yükseltildikten sonra sınıra MaxConcurrentConnections
göre 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);
})
Maksimum bağlantı sayısı varsayılan olarak sınırsızdır (null).
Maksimum istek gövdesi boyutu
Varsayılan maksimum istek gövdesi boyutu 30.000.000 bayttır ve bu da yaklaşık 28,6 MB'tır.
ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yaklaşım, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Aşağıdaki örnekte, her istekte uygulama kısıtlamasının nasıl yapılandırılır gösterilmektedir:
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ırsa bir özel durum oluşur. Özelliğin salt okunur durumda olup olmadığını MaxRequestBodySize
belirten bir IsReadOnly
özellik vardır; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.
Bir uygulama ASP.NET Çekirdek Modülü arkasında işlem dışı kaldığında istek Kestrelgövdesi boyut sınırı devre dışı bırakılır. IIS zaten sınırı ayarlar.
En düşük istek gövdesi veri hızı
MinRequestBodyDataRate
MinResponseDataRate
Kestrel veriler belirtilen hızda bayt/saniye cinsinden geliyorsa her saniyeyi denetler. Hız minimum değerin altına düşerse bağlantı zaman aşımına uğradı. Yetkisiz kullanım süresi, istemcinin gönderme oranını en düşük değere kadar artırmasına izin veren süredir Kestrel . Bu süre boyunca oran denetlenmiyor. Yetkisiz kullanım süresi, TCP yavaş başlatması nedeniyle başlangıçta yavaş hızda veri gönderen bağlantıların bırakılmasını önlemeye yardımcı olur.
Varsayılan en düşük hız, 5 saniyelik yetkisiz kullanım süresiyle 240 bayt/saniyedir.
Yanıt için en düşük oran da geçerlidir. İstek sınırını ve yanıt sınırını ayarlama kodu, özellik ve arabirim adlarına sahip veya Response
olması RequestBody
dışında aynıdır.
Aşağıda, içinde en düşük veri oranlarının nasıl yapılandırıldığını gösteren bir örnek verilmişti 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);
})
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));
}
IHttpMinResponseDataRateFeature Http/2 istekleri için önceki örnekte başvuruda bulunulamıyorHttpContext.Features. Protokolün istek çoğullama desteği nedeniyle istek başına hız sınırlarının değiştirilmesi GENELLIKLE HTTP/2 için desteklenmez. Bununla birlikte IHttpMinRequestBodyDataRateFeature HttpContext.Features
, okuma hızı sınırı bir HTTP/2 isteği için eşit olarak ayarlanarak IHttpMinResponseDataRateFeature.MinDataRate null
istek başına tamamen devre dışı bırakılabildiğinden, http/2 istekleri için hala mevcuttur. Okuma IHttpMinRequestBodyDataRateFeature.MinDataRate
girişiminde bulunulması veya değerinin dışında null
bir değere ayarlanması, http/2 isteği verilip atılmayla sonuçlanır NotSupportedException .
aracılığıyla KestrelServerOptions.Limits yapılandırılan sunucu genelinde hız sınırları, hem HTTP/1.x hem de HTTP/2 bağlantılarına uygulanır.
İstek üst bilgileri zaman aşımı
Sunucunun istek üst bilgilerini almak için harcadığı maksimum süreyi alır veya ayarlar. Varsayılan değer 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.Http2ayarlanır.
Bağlantı başına en fazla akış sayısı
HTTP/2 bağlantısı başına eşzamanlı istek akışlarının sayısını sınırlar. Fazla akışlar reddedilir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Varsayılan değer 100 şeklindedir.
Üst bilgi tablosu boyutu
HPACK kod çözücüsü, HTTP/2 bağlantıları için HTTP üst bilgilerini açar. HeaderTableSize
HPACK kod çözücüsünün kullandığı üst bilgi sıkıştırma tablosunun 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.
Maksimum ç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ğlanır ve 2^14 (16.384) ile 2^24-1 (16.777.215) arasında olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16384;
});
Varsayılan değer 2^14 'tür (16.384).
İstek üst bilgisi boyutu üst sınırı
İstek üst bilgisi değerlerinin sekizlilerinde 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österimlerindeki 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 arabelleğinin bir kerede bağlantı başına tüm istekler (akışlar) arasında toplanmış en fazla istek gövdesi verisini bayt cinsinden gösterir. İstekler ile de sınırlıdır Http2.InitialStreamWindowSize
. Değer 65.535'ten büyük veya buna eşit ve 2^31'den küçük olmalıdır (2.147.483.648).
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});
Varsayılan değer 128 KB'tır (131.072).
İlk akış penceresi boyutu
Sunucunun istek başına bir kerede arabelleğe alınan istek gövdesi verilerinin üst sınırını bayt cinsinden gösterir (akış). İstekler ile de sınırlıdır InitialConnectionWindowSize
. Değer 65.535'ten büyük veya buna eşit ve 2^31'den küçük olmalıdır (2.147.483.648).
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});
Varsayılan değer 96 KB'tır (98.304).
HTTP/2 canlı tutma ping yapılandırması
Kestrel bağlı istemcilere HTTP/2 ping'leri gönderecek şekilde yapılandırılabilir. HTTP/2 pingleri birden çok amaca hizmet eder:
- Boşta kalan bağlantıları canlı tutun. Bazı istemciler ve proxy sunucuları boşta olan bağlantıları kapatır. HTTP/2 ping'leri bir bağlantıdaki etkinlik olarak kabul edilir ve bağlantının boşta olarak kapatılmasını önler.
- İyi durumda olmayan bağlantıları kapatın. İstemcinin yapılandırılan süre içinde canlı tutma ping'ine yanıt vermediği bağlantılar sunucu tarafından kapatılır.
HTTP/2 etkin tutma ping'leriyle ilgili iki yapılandırma seçeneği vardır:
- KeepAlivePingDelay , ping aralığını yapılandıran bir TimeSpan değerdir. Sunucu, bu süre boyunca herhangi bir çerçeve almazsa istemciye canlı tutma ping'i gönderir. Bu seçenek olarak ayarlandığında TimeSpan.MaxValueCanlı tut ping'leri devre dışı bırakılır. Varsayılan değer şudur: TimeSpan.MaxValue.
- KeepAlivePingTimeout , ping zaman aşımını yapılandıran bir TimeSpan öğedir. Sunucu bu zaman aşımı sırasında yanıt ping'i gibi herhangi bir çerçeve almazsa bağlantı kapatılır. Bu seçenek olarak ayarlandığında TimeSpan.MaxValueEtkin tut zaman aşımı devre dışı bırakılır. 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 verilmeyeceğini denetler. Varsayılan değer şudur: false
.
Uyarı
Çok sayıda zaman uyumlu G/Ç işleminin engellenmesi iş parçacığı havuzu aç kalmasına neden olabilir ve bu da uygulamanın yanıt vermemesine neden olabilir. Yalnızca zaman uyumsuz G/Ç'yi desteklemeyen bir kitaplık kullanırken etkinleştirin AllowSynchronousIO
.
Aşağıdaki örnek zaman uyumlu G/Ç'yi etkinleştirir:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
})
Diğer Kestrel seçenekler ve sınırlar hakkında bilgi için bkz:
ASP.NET Core