ASP.NET Core Kestrel web sunucusu seçeneklerini yapılandırma

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 MinRequestBodyDataRateMinResponseDataRate 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 nullIHttpMinResponseDataRateFeature.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ğlan, 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ı

KeepAliveTimeout

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

MaxRequestBodySize

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 IHttpMinRequestBodyDataRateFeatureHttpContext.Features, okuma hızı sınırı bir HTTP/2 isteği için eşit olarak ayarlanarak IHttpMinResponseDataRateFeature.MinDataRatenull 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ı

RequestHeadersTimeout

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ı

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.

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

Varsayılan değer 100 şeklindedir.

Üst bilgi tablosu boyutu

HeaderTableSize

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

MaxFrameSize

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ı

MaxRequestHeaderFieldSize

İ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

InitialConnectionWindowSize

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

InitialStreamWindowSize

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ğlan, 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: