KestrelASP.NET Core'de web sunucusu uygulaması

Tom Dykstra, Chris Chris Chrisve Stephen Halter tarafından

Kestrel, için platformlar arası bir web ASP.NET Core. Kestrel, proje şablonlarına dahil edilen ve varsayılan olarak etkin ASP.NET Core sunucusudur.

Kestrel aşağıdaki senaryoları destekler:

  • HTTPS
  • HTTP/2 (macOS † hariç)
  • WebSockets'i etkinleştirmek için kullanılan opak yükseltme
  • Nginx'in arkasında yüksek performans için Unix yuvaları

†HTTP/2, gelecek bir sürümde macOS'ta desteklenecegizli olacak.

Kestrel , .NET Core'un desteklediği tüm platformlarda ve sürümlerde de desteklemektedir.

Örnek kodu görüntüleme veya indirme ( nasılindir)

başlarken

ASP.NET Core proje şablonları varsayılan Kestrel olarak kullanılır. Program.cs içinde yöntemi ConfigureWebHostDefaults çağrısında UseKestrel bulundu:

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Konak oluşturma hakkında daha fazla bilgi için, 'nin Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine ASP.NET Core .NET genel ana bilgisayarı bakın.

İsteğe bağlı istemci sertifikaları

Uygulamanın bir alt kümesini bir sertifika ile korumanız gereken uygulamalar hakkında bilgi için bkz. İsteğe bağlı istemci sertifikaları.

Ek kaynaklar

Not

5 ASP.NET Core 5.0'dan sonra Kestrel libuv taşıması artık kullanılmıyor. Libuv taşıması, Windows ARM64 gibi yeni işletim sistemi platformlarını desteklemek için güncelleştirmeler almaz ve gelecek bir sürümde kaldırılacaktır. Eski yönteme yapılan çağrıları UseLibuv kaldırın ve bunun yerine Kestrel 'nin varsayılan Yuva taşıması kullanın.

Kestrel, için platformlar arası bir web ASP.NET Core. Kestrel, proje şablonlarına varsayılan olarak dahil ASP.NET Core sunucusudur.

Kestrel aşağıdaki senaryoları destekler:

  • HTTPS
  • WebSockets'i etkinleştirmek için kullanılan opak yükseltme
  • Nginx'in arkasında yüksek performans için Unix yuvaları
  • HTTP/2 (macOS † hariç)

†HTTP/2, gelecek bir sürümde macOS'ta desteklenecegizli olacak.

Kestrel , .NET Core'un desteklediği tüm platformlarda ve sürümlerde de desteklemektedir.

Örnek kodu görüntüleme veya indirme ( nasılindir)

HTTP/2 desteği

Http/2, aşağıdaki ASP.NET Core karşılarsa bu uygulamalar için kullanılabilir:

  • İşletim sistemi†
    • Windows Server 2016/Windows 10 veya sonraki bir‡
    • OpenSSL 1.0.2 veya sonraki sürümleriyle Linux (örneğin Ubuntu 16.04 veya sonraki bir sürümü)
  • Hedef çerçeve: .NET Core 2.2 veya sonraki bir
  • Uygulama Katmanı Protokol Anlaşması (KATMANıN) bağlantısı
  • TLS 1.2 veya sonraki bir bağlantı

†HTTP/2, gelecek bir sürümde macOS'ta desteklenecegizli olacak. ‡Kestrel, R2 ve Windows Server 2012 üzerinde HTTP/2 için sınırlı Windows 8.1. Bu işletim sistemlerinde kullanılabilen desteklenen TLS şifreleme paketlerinin listesi sınırlı olduğundan destek sınırlıdır. TLS bağlantılarının güvenliğini sağlamak için Eliptik Eğri Dijital İmza Algoritması (ECDSA) kullanılarak oluşturulan bir sertifika gerekebilir.

Bir HTTP/2 bağlantısı kurulursa, HttpRequest.Protocol HTTP/2 raporları.

.NET Core 3.0'dan başlayarak HTTP/2 varsayılan olarak etkindir. Yapılandırma hakkında daha fazla bilgi için Kestrel seçenekler ve ListenOptions.Protocols bölümlerine bakın.

Ters ara sunucu Kestrel ile ne zaman kullanmalı?

Kestreltek başına veya Internet Information Services (IIS) , Nginxveya Apache gibi bir ters ara sunucu ile kullanılabilir. Ters ara sunucu, ağdan HTTP isteklerini alır ve bu istekleri adresine Kestrel iletir.

Kestrel uç (İnternet'e yönelik) web sunucusu olarak kullanılır:

Kestrel ters ara sunucu olmadan doğrudan İnternet ile iletişim kurar

Kestrel ters ara sunucu yapılandırmasında kullanılır:

Kestrel IIS, Nginx veya Apache gibi bir ters ara sunucu üzerinden dolaylı olarak İnternet ile iletişim kurar

Ters proxy sunucusu olan veya olmayan yapılandırma desteklenen bir barındırma yapılandırmasıdır.

Kestrel ters proxy sunucusu olmayan bir uç sunucu olarak kullanılır, aynı IP ve bağlantı noktasının birden çok işlem arasında paylaşımını desteklemez. Bir bağlantı noktasını dinleyecek şekilde yapılandırıldığında, isteklerin üst bilgilerden bağımsız olarak bu Kestrel bağlantı noktası için tüm trafiği Kestrel Host işler. Bağlantı noktalarını paylaştıran bir ters ara sunucu, istekleri benzersiz bir IP ve Kestrel bağlantı noktası üzerinde adresine iletebilir.

Ters ara sunucu gerekli değilse bile, ters ara sunucu kullanmak iyi bir seçenek olabilir.

Ters ara sunucu:

  • Barındır olduğu uygulamaların açık genel yüzey alanı sınırlayıcı olabilir.
  • Ek bir yapılandırma ve savunma katmanı sağlama.
  • Var olan altyapıyla daha iyi tümleştiri olabilir.
  • Yük dengelemeyi ve güvenli iletişim (HTTPS) yapılandırmasını basitleştirin. Yalnızca ters ara sunucu bir X.509 sertifikası gerektirir ve bu sunucu, düz HTTP kullanarak iç ağ üzerinde uygulamanın sunucularıyla iletişim kurabilir.

Uyarı

Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.

KestrelASP.NET Core uygulamalarda

ASP.NET Core proje şablonları varsayılan Kestrel olarak kullanılır. Program.cs içinde yöntemi ConfigureWebHostDefaults çağrısında UseKestrel bulundu:

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

Konak oluşturma hakkında daha fazla bilgi için, 'nin Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine ASP.NET Core .NET genel ana bilgisayarı bakın.

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

Kestrel Seçenekler

Web Kestrel sunucusunun, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçenekleri vardır.

sınıfının özelliği Limits üzerinde 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 appsettings.json appsettings'den yapılandırmayı yükleyemedi.{ Environment}.json dosyası:

{
  "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.ConfigureServices yapılandırma:

    1. sınıfına bir IConfiguration örneği Startup ekleme. Aşağıdaki örnekte, özelliğine yeni yapılandırmanın atandığı Configuration varsayıldı.

    2. içinde, Startup.ConfigureServices yapılandırma Kestrel bö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:

    Program.cs içinde, yapılandırma Kestrel bö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.

Canlı tutma zaman aşımı

KeepAliveTimeout

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 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 (örneğin, Bir WebSockets isteği üzerinde) yükseltilen bağlantılar için ayrı bir sınır vardır. Bir bağlantı yükseltildikten sonra, bu sınıra göre sayılmaz MaxConcurrentConnections .

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ız (null).

En büyük istek gövdesi boyutu

MaxRequestBodySize

Varsayılan en büyük istek gövdesi boyutu 30.000.000 bayttır ve bu değer 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, RequestSizeLimitAttribute bir eylem yönteminde özniteliğini kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Her istekte uygulama için kısıtlamanın nasıl yapılandırılacağını gösteren bir örnek aşağıda verilmiştir:

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ım içindeki belirli bir istek üzerindeki 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 bir istek üzerindeki sınırı yapılandırırsa, bir özel durum oluşturulur. IsReadOnlyÖzelliğin salt okuma durumunda olup olmadığını belirten bir özellik vardır. Bu, MaxRequestBodySize sınırı yapılandırmanın çok geç olduğunu gösterir.

bir uygulama ASP.NET Core modülününarkasında çalıştırıldığında , Kestrel ııs sınırı zaten ayarladığı için istek gövdesi boyut sınırı devre dışı bırakılır.

En az istek gövdesi veri hızı

MinRequestBodyDataRate MinResponseDataRate

Kestrel veriler belirtilen hızda bayt/saniye olarak ulaşan her saniye bir denetler. Oran en düşük değerin altına düşerse bağlantı zaman aşımına uğrar. Yetkisiz kullanım süresi, Kestrel istemcinin gönderme hızını en düşüye artırması için gereken süredir. bu süre boyunca fiyat denetlenmez. Yetkisiz kullanım süresi, TCP yavaş başlatma nedeniyle başlangıçta verileri yavaş bir hızda gönderen bağlantıların bırakılmasını önlemeye yardımcı olur.

Varsayılan en düşük oran, 5 saniyelik bir yetkisiz kullanım süresi ile 240 bayt/saniye olur.

Yanıt için bir minimum oran da geçerlidir. İstek sınırını ayarlamaya yönelik kod ve yanıt sınırı, RequestBody Response özellik ve arabirim adlarında olduğu gibi aynı olur.

İşte, program. cs' de en düşük veri hızlarının nasıl yapılandırılacağını gösteren bir örnek:

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ım içindeki istek başına düşen minimum 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Önceki örnekte başvurulan, HttpContext.Features http/2 isteklerinde hız sınırlarını değiştirmek, protokolün istek çoğullama DESTEĞI nedeniyle http/2 için genel olarak desteklenmediği IÇIN, http/2 istekleri için ' de mevcut değildir. Ancak, http IHttpMinRequestBodyDataRateFeature HttpContext.Features /2 istekleri için yine de vardır, çünkü okuma hızı sınırı, IHttpMinRequestBodyDataRateFeature.MinDataRate null bir http/2 isteği için de olarak ayarlanarak tamamen istek temelli olarak devre dışı bırakılabilir. IHttpMinRequestBodyDataRateFeature.MinDataRateBunun dışında bir değere ayarlamaya çalışılması veya BIR null NotSupportedException http/2 isteği verilmeye neden olur.

KestrelServerOptions.LimitsHttp/1. x ve http/2 bağlantılarına hala uygulanan sunucu genelindeki hız sınırları.

İstek üst bilgileri zaman aşımı

RequestHeadersTimeout

Sunucunun istek üst bilgilerini alması için harcadığı en uzun 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);
})

Bağlantı başına en fazla akış

Http2.MaxStreamsPerConnection HTTP/2 bağlantısı başına eşzamanlı istek akışı sayısını sınırlar. Fazlalık akışlar reddedildi.

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

Varsayılan değer 100’dür.

Üst bilgi tablosu boyutu

HPACK kod çözücüsü HTTP/2 bağlantıları için HTTP üstbilgilerini açar. Http2.HeaderTableSize HPACK kod çözücüsünün kullandığı üst bilgi sıkıştırma tablosunun boyutunu sınırlandırır. Değer sekizli cinsinden sağlanır ve sıfırdan büyük olmalıdır (0).

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

Varsayılan değer 4096 ' dir.

En büyük çerçeve boyutu

Http2.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 belirtir. Değer sekizli cinsinden 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 ' dir (16.384).

En fazla istek üst bilgi boyutu

Http2.MaxRequestHeaderFieldSize istek üst bilgisi değerlerinin sekizlisi cinsinden izin verilen en büyük boyutu belirtir. Bu sınır, sıkıştırılmış ve sıkıştırılmamış temsillerinde hem ad hem de değer için geçerlidir. Değer sıfırdan büyük (0) olmalıdır.

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

Varsayılan değer 8.192 ' dir.

İlk bağlantı pencere boyutu

Http2.InitialConnectionWindowSize sunucu, bağlantı başına tüm istekler (akışlar) genelinde toplanan tek seferde sunucunun arabelleğe aldığı en fazla istek gövde verilerini bayt cinsinden gösterir. İstekleri ile de sınırlıdır Http2.InitialStreamWindowSize . Değer, 65.535 değerinden büyük veya buna eşit ve 2 ^ 31 (2.147.483.648) değerinden küçük olmalıdır.

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

Varsayılan değer 128 KB 'tır (131.072).

İlk akış pencere boyutu

Http2.InitialStreamWindowSize sunucu, istek başına bir kez (Stream) arabelleğe alınan en fazla istek gövde verilerini bayt cinsinden gösterir. İstekleri ile de sınırlıdır Http2.InitialConnectionWindowSize . Değer, 65.535 değerinden büyük veya buna eşit ve 2 ^ 31 (2.147.483.648) değerinden küçük olmalıdır.

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

Varsayılan değer 96 KB 'tır (98.304).

Larına

HTTP Trailer'lar HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilirler. IIS ve HTTP.sys, yalnızca HTTP/2 yanıt tanıtımları de destekler.

if (httpContext.Response.SupportsTrailers())
{
    httpContext.Response.DeclareTrailer("trailername"); 

    // Write body
    httpContext.Response.WriteAsync("Hello world");

    httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}

Yukarıdaki örnek kodda:

  • SupportsTrailers , yanıt için tanıtımların desteklenesini sağlar.
  • DeclareTrailer verilen tanıtım adını yanıt üst Trailer bilgisinde ekler. Yanıtın tanıtımları bildirilse de isteğe bağlıdır, ancak önerilir. DeclareTrailerçağrılırsa, yanıt üst bilgileri gönderilmeden önce olması gerekir.
  • AppendTrailer , tanıtıma ekler.

Sıfırla

Sıfırlama, sunucunun belirtilen bir hata kodu ile HTTP/2 isteğini sıfırlamasına izin verir. Bir sıfırlama isteği durdurulan kabul edilir.

var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);

Reset Yukarıdaki kod örneğinde INTERNAL_ERROR hata kodu belirtilir. HTTP/2 hata kodları hakkında daha fazla bilgi için http/2 belirtim hata kodu bölümünüziyaret edin.

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.:

Uç nokta yapılandırması

varsayılan olarak, ASP.NET Core bağlar:

  • http://localhost:5000
  • https://localhost:5001 (bir yerel geliştirme sertifikası varsa)

Kullanarak URL 'Leri belirtin:

  • ASPNETCORE_URLS ortam değişkeni.
  • --urls komut satırı bağımsız değişkeni.
  • urls Ana bilgisayar yapılandırma anahtarı.
  • UseUrls genişletme yöntemi.

Bu yaklaşımlar kullanılarak sağlanan değer bir veya daha fazla HTTP ve HTTPS uç noktası olabilir (varsayılan bir sertifika varsa HTTPS). Değeri noktalı virgülle ayrılmış bir liste olarak yapılandırın (örneğin, "Urls": "http://localhost:8000;http://localhost:8001" ).

Bu yaklaşımlar hakkında daha fazla bilgi için sunucu URL 'leri ve geçersiz kılma yapılandırmasıbölümüne bakın.

Geliştirme sertifikası oluşturuldu:

Bazı tarayıcılarda yerel geliştirme sertifikasına güvenmek için açık izin verilmesi gerekir.

Project şablonlar, uygulamaları https 'de varsayılan olarak çalışacak şekilde yapılandırır ve https yeniden yönlendirme ve hsts desteğiiçerir.

Listen ListenUnixSocket KestrelServerOptions URL öneklerini ve bağlantı noktalarını yapılandırmak için çağrısı yapın veya yöntemleri Kestrel .

UseUrls, --urls komut satırı bağımsız değişkeni, urls ana bilgisayar yapılandırma anahtarı ve ASPNETCORE_URLS ortam değişkeni de çalışır, ancak bu bölümün ilerleyen kısımlarında belirtilen sınırlamalara sahiptir (https uç noktası yapılandırması için varsayılan sertifika kullanılabilir olmalıdır).

KestrelServerOptions yapılandırmada

ConfigureEndpointDefaults Varsayılanları (eylem <ListenOptions> )

ActionBelirtilen her bir uç nokta için çalıştırılacak bir yapılandırma belirtir. ConfigureEndpointDefaultsBirden çok kez çağırma önceki Action s 'yi son belirtilen ile değiştirir Action .

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.ConfigureEndpointDefaults(listenOptions =>
    {
        // Configure endpoint defaults
    });
});

Not

Çağrılmadan önce çağırarak oluşturulan uç noktalara Listen ConfigureEndpointDefaults varsayılan değer uygulanmaz.

ConfigureHttpsDefaults (eylem <HttpsConnectionAdapterOptions> )

ActionHer HTTPS uç noktası için çalıştırılacak bir yapılandırma belirtir. ConfigureHttpsDefaultsBirden çok kez çağırma önceki Action s 'yi son belirtilen ile değiştirir Action .

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.ConfigureHttpsDefaults(listenOptions =>
    {
        // certificate is an X509Certificate2
        listenOptions.ServerCertificate = certificate;
    });
});

Not

Çağrılmadan önce çağırarak oluşturulan uç noktalara Listen ConfigureHttpsDefaults varsayılan değer uygulanmaz.

Yapılandırma (Iconation)

Kurulumu için Kestrel bir as girdisi alan bir yapılandırma yükleyicisi oluşturur IConfiguration . Yapılandırma, için yapılandırma bölümünün kapsamına alınmalıdır Kestrel .

ListenOptions. UseHttps

KestrelHTTPS kullanacak şekilde yapılandırın.

ListenOptions.UseHttps uzantılardan

  • UseHttps: Kestrel Varsayılan SERTIFIKAYLA HTTPS kullanacak şekilde yapılandırın. Varsayılan sertifika yapılandırılmamışsa bir özel durum oluşturur.
  • UseHttps(string fileName)
  • UseHttps(string fileName, string password)
  • UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(StoreName storeName, string subject)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(X509Certificate2 serverCertificate)
  • UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)

ListenOptions.UseHttps parametrelere

  • filename , uygulamanın içerik dosyalarını içeren dizine göre bir sertifika dosyasının yolu ve dosya adıdır.
  • password X. 509.440 sertifika verilerine erişmek için parola gereklidir.
  • configureOptions , öğesini Action yapılandırmak için kullanılır HttpsConnectionAdapterOptions . Döndürür ListenOptions .
  • storeName , sertifikanın yükleneceği sertifika deposudur.
  • subject , sertifika için konu adıdır.
  • allowInvalid geçersiz sertifikaların, otomatik olarak imzalanan sertifikalar gibi göz önünde bulundurulmayacağını gösterir.
  • location , sertifikanın yükleneceği mağaza konumudur.
  • serverCertificate , X. 509.440 sertifikasıdır.

Üretimde HTTPS 'nin açıkça yapılandırılması gerekir. En azından, varsayılan bir sertifika sağlanmalıdır.

Daha sonra açıklanan desteklenen yapılandırma:

  • Yapılandırma yok
  • Varsayılan sertifikayı yapılandırmadan Değiştir
  • Koddaki varsayılanları değiştirme

Yapılandırma yok

Kestrel ve üzerinde http://localhost:5000 dinler https://localhost:5001 (varsayılan sertifika varsa).

Varsayılan sertifikayı yapılandırmadan Değiştir

CreateDefaultBuilder``Configure(context.Configuration.GetSection("Kestrel"))yapılandırmayı yüklemek için varsayılan olarak çağırır Kestrel . İçin varsayılan bir HTTPS uygulama ayarları yapılandırma şeması bulunur Kestrel . Disk üzerindeki bir dosyadan ya da bir sertifika deposundan kullanılacak URL 'Ler ve Sertifikalar dahil olmak üzere birden çok uç nokta yapılandırın.

Aşağıdaki appsettings.json örnekte:

  • Geçersiz sertifikaların kullanılmasına izin vermek için Allowwınvalid true ' i ayarlayın (örneğin, otomatik olarak imzalanan sertifikalar).
  • Bir sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte bulunan httpsdefaultcert ), Sertifikalar > varsayılan veya geliştirme sertifikası altında tanımlanan sertifikaya geri döner.
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:5000"
      },
      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      },
      "HttpsInlineCertStore": {
        "Url": "https://localhost:5002",
        "Certificate": {
          "Subject": "<subject; required>",
          "Store": "<certificate store; required>",
          "Location": "<location; defaults to CurrentUser>",
          "AllowInvalid": "<true or false; defaults to false>"
        }
      },
      "HttpsDefaultCert": {
        "Url": "https://localhost:5003"
      },
      "Https": {
        "Url": "https://*:5004",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    },
    "Certificates": {
      "Default": {
        "Path": "<path to .pfx file>",
        "Password": "<certificate password>"
      }
    }
  }
}

Herhangi bir sertifika düğümü için yol ve parola kullanmanın alternatifi sertifika deposu alanlarını kullanarak sertifikayı belirtmektir. Örneğin, sertifika > varsayılan sertifikası şu şekilde belirtilebilir:

"Default": {
  "Subject": "<subject; required>",
  "Store": "<cert store; required>",
  "Location": "<location; defaults to CurrentUser>",
  "AllowInvalid": "<true or false; defaults to false>"
}

Şema notları:

  • Uç nokta adları büyük/küçük harfe duyarlıdır. Örneğin, HTTPS ve Https geçerlidir.
  • UrlHer uç nokta için parametresi gereklidir. Bu parametrenin biçimi, en üst düzey Urls yapılandırma parametresiyle aynıdır, ancak tek bir değerle sınırlı olur.
  • Bu uç noktalar, üst düzey yapılandırmada tanımlananlar yerine Urls bunlara ekleme yerine bunların yerini alır. Kullanılarak kodda tanımlanan uç noktalar Listen yapılandırma bölümünde tanımlanan uç noktalar ile birikimlidir.
  • Bu Certificate bölüm isteğe bağlıdır. CertificateBölüm belirtilmemişse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Kullanılabilir varsayılan değer yoksa, sunucu bir özel durum oluşturur ve başlayamaz.
  • Bu Certificate bölüm hem yolparolasını hem de Konudeposu sertifikalarını destekler.
  • Herhangi bir sayıda uç nokta, bağlantı noktası çakışmalarına neden olmadıkları sürece bu şekilde tanımlanabilir.
  • options.Configure(context.Configuration.GetSection("{SECTION}")) yapılandırılmış bir KestrelConfigurationLoader .Endpoint(string name, listenOptions => { }) uç noktanın ayarlarını tamamlamak için kullanılabilecek bir yöntemi olan bir döndürür:
webBuilder.UseKestrel((context, serverOptions) =>
{
    serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
        .Endpoint("HTTPS", listenOptions =>
        {
            listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
        });
});

KestrelServerOptions.ConfigurationLoader , tarafından sağlana gibi var olan yükleyicisindeki yinelemeye devam etmek için doğrudan erişilebilir CreateDefaultBuilder .

  • Her uç noktanın yapılandırma bölümü, Endpoint özel ayarların okunabilmesi için yöntemindeki seçeneklerde kullanılabilir.
  • Birden çok yapılandırma, options.Configure(context.Configuration.GetSection("{SECTION}")) başka bir bölümle yeniden çağırarak yüklenebilir. Önceki örneklerde açıkça çağrılmadığı takdirde, yalnızca son yapılandırma kullanılır Load . Metapackage, Load varsayılan yapılandırma bölümünün değiştirilmesini sağlayacak şekilde çağırmıyor.
  • KestrelConfigurationLoader``ListenAPI ailesini KestrelServerOptions Endpoint aşırı yükleme olarak yansıtır, bu nedenle kod ve yapılandırma uç noktaları aynı yerde yapılandırılabilir. Bu aşırı yüklemeler adları kullanmaz ve yalnızca yapılandırmadan varsayılan ayarları kullanır.

Koddaki varsayılanları değiştirme

ConfigureEndpointDefaults ve ConfigureHttpsDefaults ListenOptions HttpsConnectionAdapterOptions , önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma dahil, ve için varsayılan ayarları değiştirmek üzere kullanılabilir. ConfigureEndpointDefaults ve ConfigureHttpsDefaults herhangi bir uç nokta yapılandırılmadan önce çağrılmalıdır.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.ConfigureEndpointDefaults(listenOptions =>
    {
        // Configure endpoint defaults
    });

    serverOptions.ConfigureHttpsDefaults(listenOptions =>
    {
        listenOptions.SslProtocols = SslProtocols.Tls12;
    });
});

Kestrel SNı desteği

Sunucu adı belirtme (SNı) , aynı IP adresi ve bağlantı noktası üzerinde birden fazla etki alanını barındırmak için kullanılabilir. SNı 'nin çalışması için, istemci, TLS el sıkışması sırasında güvenli oturum ana bilgisayar adını, sunucunun doğru sertifikayı sağlayabilmesi için gönderir. İstemci, TLS anlaşmasını izleyen güvenli oturum sırasında sunucuyla şifreli iletişim için bulunan sertifikayı kullanır.

Kestrel geri çağırma aracılığıyla SNı 'yi destekler ServerCertificateSelector . Geri çağırma, uygulamanın ana bilgisayar adını incelemesine ve uygun sertifikayı seçmesini sağlamak için bağlantı başına bir kez çağrılır.

SNı desteği şunları gerektirir:

  • Hedef Framework netcoreapp2.1 veya sonraki sürümlerde çalışıyor. net461Veya sonraki sürümlerde, geri çağırma çağrılır, ancak name her zaman olur null . nameAyrıca, null ISTEMCI, TLS el sıkışmasının ana bilgisayar adı parametresini sağlamıyorsa de olur.
  • Tüm Web siteleri aynı örnek üzerinde çalışır Kestrel . Kestrel , bir IP adresinin ve bağlantı noktasının bir ters proxy olmadan birden çok örnek arasında paylaşılmasını desteklemez.
webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenAnyIP(5005, listenOptions =>
    {
        listenOptions.UseHttps(httpsOptions =>
        {
            var localhostCert = CertificateLoader.LoadFromStoreCert(
                "localhost", "My", StoreLocation.CurrentUser,
                allowInvalid: true);
            var exampleCert = CertificateLoader.LoadFromStoreCert(
                "example.com", "My", StoreLocation.CurrentUser,
                allowInvalid: true);
            var subExampleCert = CertificateLoader.LoadFromStoreCert(
                "sub.example.com", "My", StoreLocation.CurrentUser,
                allowInvalid: true);
            var certs = new Dictionary<string, X509Certificate2>(
                StringComparer.OrdinalIgnoreCase);
            certs["localhost"] = localhostCert;
            certs["example.com"] = exampleCert;
            certs["sub.example.com"] = subExampleCert;

            httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
            {
                if (name != null && certs.TryGetValue(name, out var cert))
                {
                    return cert;
                }

                return exampleCert;
            };
        });
    });
});

Bağlantı günlüğü

UseConnectionLoggingBir bağlantıda bayt düzeyinde iletişim Için hata ayıklama düzeyi günlüklerini yayma çağrısı. Bağlantı günlüğü, TLS şifreleme ve proxy 'nin arkasındaki gibi alt düzey iletişimde sorunları gidermeye yardımcı olur. UseConnectionLoggingDaha önce yerleştirilmişse UseHttps , şifrelenmiş trafik günlüğe kaydedilir. UseConnectionLoggingÖğesinden sonra yerleştirilmişse UseHttps , şifresi çözülmüş trafik günlüğe kaydedilir.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.UseConnectionLogging();
    });
});

TCP yuvasına bağlama

ListenYöntemi BIR TCP yuvasına bağlanır ve bir seçenek lambda X. 509.440 sertifika yapılandırmasına izin verir:

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(serverOptions =>
            {
                serverOptions.Listen(IPAddress.Loopback, 5000);
                serverOptions.Listen(IPAddress.Loopback, 5001, 
                    listenOptions =>
                    {
                        listenOptions.UseHttps("testCert.pfx", 
                            "testPassword");
                    });
            })
            .UseStartup<Startup>();
        });

Örnek, HTTPS 'yi ile bir uç nokta için yapılandırır ListenOptions . Belirli uç noktalara yönelik diğer ayarları yapılandırmak için aynı API 'yi kullanın Kestrel .

Windows 'da, otomatik olarak imzalanan sertifikalar New-SelfSignedCertificate PowerShell cmdlet 'ikullanılarak oluşturulabilir. Desteklenmeyen bir örnek için bkz. UpdateIISExpressSSLForChrome.ps1.

MacOS, Linux ve Windows 'da, Sertifikalar OpenSSLkullanılarak oluşturulabilir.

UNIX yuvasına bağlama

ListenUnixSocketAşağıdaki örnekte gösterildiği gibi NGINX ile gelişmiş performans için ile birlikte bir UNIX yuvası dinleyin:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
    serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock", 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testpassword");
        });
})
  • NGINX yapılandırma dosyasında, server > location > proxy_pass girdisini olarak ayarlayın http://unix:/tmp/{KESTREL SOCKET}:/; . {KESTREL SOCKET} , için belirtilen yuvanın adıdır ListenUnixSocket (örneğin, kestrel-test.sock Önceki örnekte).
  • Yuvanın NGINX tarafından yazılabilir olduğundan emin olun (örneğin, chmod go+w /tmp/kestrel-test.sock ).

Bağlantı noktası 0

Bağlantı noktası numarası 0 belirtildiğinde, Kestrel dinamik olarak kullanılabilir bir bağlantı noktasına bağlanır. Aşağıdaki örnek, çalışma zamanında gerçekten hangi bağlantı noktasının bağlandığını nasıl belirleyeceğini göstermektedir Kestrel :

public void Configure(IApplicationBuilder app)
{
    var serverAddressesFeature = 
        app.ServerFeatures.Get<IServerAddressesFeature>();

    app.UseStaticFiles();

    app.Run(async (context) =>
    {
        context.Response.ContentType = "text/html";
        await context.Response
            .WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
                "<title></title></head><body><p>Hosted by Kestrel</p>");

        if (serverAddressesFeature != null)
        {
            await context.Response
                .WriteAsync("<p>Listening on the following addresses: " +
                    string.Join(", ", serverAddressesFeature.Addresses) +
                    "</p>");
        }

        await context.Response.WriteAsync("<p>Request URL: " +
            $"{context.Request.GetDisplayUrl()}<p>");
    });
}

Uygulama çalıştırıldığında konsol penceresi çıkışı, uygulamanın erişilebileceği dinamik bağlantı noktasını gösterir:

Listening on the following addresses: http://127.0.0.1:48508

Sınırlamalar

Aşağıdaki yaklaşımlar ile uç noktaları yapılandırın:

  • UseUrls
  • --urls komut satırı bağımsız değişkeni
  • urls Ana bilgisayar yapılandırma anahtarı
  • ASPNETCORE_URLS ortam değişkeni

Bu yöntemler, kodun dışındaki sunucularla kod çalışmasını sağlamak için yararlıdır Kestrel . Ancak, aşağıdaki sınırlamalara dikkat edin:

  • HTTPS uç noktası yapılandırmasında varsayılan bir sertifika sağlanmadığı sürece HTTPS bu yaklaşımlar ile kullanılamaz (örneğin, KestrelServerOptions Bu konunun önceki kısımlarında gösterildiği gibi yapılandırma veya yapılandırma dosyası kullanılıyor).
  • Hem hem de Listen UseUrls yaklaşımları aynı anda kullanıldığında, uç noktalar Listen UseUrls uç noktaları geçersiz kılar.

IIS uç nokta yapılandırması

IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya ya da tarafından ayarlanır Listen UseUrls . daha fazla bilgi için ASP.NET Core modülü konusuna bakın.

ListenOptions. Protocols

ProtocolsÖzelliği, HttpProtocols bir bağlantı uç noktasında veya sunucu IÇIN etkin HTTP protokollerini () belirler. ProtocolsSabit listesinden özelliğe bir değer atayın HttpProtocols .

HttpProtocols sabit listesi değeri Bağlantı protokolü izin verildi
Http1 Yalnızca HTTP/1.1. , TLS olmadan veya ile kullanılabilir.
Http2 Yalnızca HTTP/2. Yalnızca istemci önceki bir bilgi modunuDESTEKLIYORSA, TLS olmadan kullanılabilir.
Http1AndHttp2 HTTP/1.1 ve HTTP/2. HTTP/2, istemcinin TLS uygulama katmanı protokol anlaşması (ALPN) el sıkışmasında http/2 seçmesini gerektirir; Aksi takdirde, bağlantı varsayılan olarak HTTP/1.1 ' dir.

ListenOptions.ProtocolsHerhangi bir uç nokta için varsayılan değer HttpProtocols.Http1AndHttp2 .

HTTP/2 için TLS kısıtlamaları:

  • TLS sürüm 1,2 veya üzeri
  • Yeniden anlaşma devre dışı
  • Sıkıştırma devre dışı
  • En az kısa ömürlü anahtar değişim boyutları:
    • Eliptik Eğri Diffie-Hellman (ECDHE) [ RFC4492 ] : 224 bit minimum
    • Sınırlı alan Diffie-Hellman (DHE) [ TLS12 ] : 2048 bit minimum
  • Şifre paketi yasaklandı.

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256[TLS-ECDHE] P-256 eliptik eğrisi [ FIPS186 ] Varsayılan olarak desteklenir.

Aşağıdaki örnek, 8000 numaralı bağlantı noktasında HTTP/1.1 ve HTTP/2 bağlantılarına izin verir. Bağlantılar, sağlanan bir sertifikayla TLS ile güvenlidir:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.UseHttps("testCert.pfx", "testPassword");
    });
});

Gerektiğinde belirli şifrelemeler için TLS el sıkışmaları için bağlantı temelinde filtre uygulamak üzere bağlantı ara yazılımı kullanın.

Aşağıdaki örnek, NotSupportedException uygulamanın desteklemediği herhangi bir şifre algoritması için oluşturur. Alternatif olarak, ılshandshakefeature. CipherAlgorithm öğesini kabul edilebilir şifreleme paketleri listesi ile tanımlayın ve karşılaştırın.

CipherAlgorithmType. null şifre algoritması ile hiçbir şifreleme kullanılmaz.

// using System.Net;
// using Microsoft.AspNetCore.Connections;

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.UseHttps("testCert.pfx", "testPassword");
        listenOptions.UseTlsFilter();
    });
});
using System;
using System.Security.Authentication;
using Microsoft.AspNetCore.Connections.Features;

namespace Microsoft.AspNetCore.Connections
{
    public static class TlsFilterConnectionMiddlewareExtensions
    {
        public static IConnectionBuilder UseTlsFilter(
            this IConnectionBuilder builder)
        {
            return builder.Use((connection, next) =>
            {
                var tlsFeature = connection.Features.Get<ITlsHandshakeFeature>();

                if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
                {
                    throw new NotSupportedException("Prohibited cipher: " +
                        tlsFeature.CipherAlgorithm);
                }

                return next();
            });
        }
    }
}

Bağlantı filtrelemesi, bir lambda aracılığıyla da yapılandırılabilir IConnectionBuilder :

// using System;
// using System.Net;
// using System.Security.Authentication;
// using Microsoft.AspNetCore.Connections;
// using Microsoft.AspNetCore.Connections.Features;

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.UseHttps("testCert.pfx", "testPassword");
        listenOptions.Use((context, next) =>
        {
            var tlsFeature = context.Features.Get<ITlsHandshakeFeature>();

            if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
            {
                throw new NotSupportedException(
                    $"Prohibited cipher: {tlsFeature.CipherAlgorithm}");
            }

            return next();
        });
    });
});

Linux 'ta, CipherSuitesPolicy TLS el sıkışmaları her bağlantı temelinde filtrelemek için kullanılabilir:

// using System.Net.Security;
// using Microsoft.AspNetCore.Hosting;
// using Microsoft.AspNetCore.Server.Kestrel.Core;
// using Microsoft.Extensions.DependencyInjection;
// using Microsoft.Extensions.Hosting;

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.ConfigureHttpsDefaults(listenOptions =>
    {
        listenOptions.OnAuthenticate = (context, sslOptions) =>
        {
            sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(
                new[]
                {
                    TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                    TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                    // ...
                });
        };
    });
});

Protokolü yapılandırmadan ayarla

CreateDefaultBuilder``serverOptions.Configure(context.Configuration.GetSection("Kestrel"))yapılandırmayı yüklemek için varsayılan olarak çağırır Kestrel .

Aşağıdaki appsettings.json örnek, tüm uç noktalar için varsayılan bağlantı protokolü olarak http/1.1 'yi kurar:

{
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http1"
    }
  }
}

Aşağıdaki appsettings.json örnek, belirli bir uç nokta IÇIN http/1.1 bağlantı protokolünü belirler:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsDefaultCert": {
        "Url": "https://localhost:5001",
        "Protocols": "Http1"
      }
    }
  }
}

Yapılandırma tarafından ayarlanan kod geçersiz kılma değerlerinde belirtilen protokoller.

URL önekleri

UseUrls, --urls Komut satırı bağımsız değişkeni, urls ana bilgisayar yapılandırma anahtarı veya ASPNETCORE_URLS ortam değişkeni kullanılırken, URL önekleri aşağıdaki biçimlerden birinde olabilir.

Yalnızca HTTP URL ön ekleri geçerlidir. Kestrel , kullanılarak URL bağlamaları yapılandırılırken HTTPS 'YI desteklemez UseUrls .

  • Bağlantı noktası numarası olan IPv4 adresi

    http://65.55.39.10:80/
    

    0.0.0.0 Tüm IPv4 adreslerine bağlanan özel bir durumdur.

  • Bağlantı noktası numarasına sahip IPv6 adresi

    http://[0:0:0:0:0:ffff:4137:270a]:80/
    

    [::] , IPv4 'un IPv6 eşdeğeridir 0.0.0.0 .

  • Bağlantı noktası numarası olan ana bilgisayar adı

    http://contoso.com:80/
    http://*:80/
    

    , Ve ana bilgisayar adları * + özel değildir. Geçerli bir IP adresi olarak tanınmayan veya localhost tüm IPv4 ve IPv6 IP 'lerine bağlanan her şey. farklı ana bilgisayar adlarını aynı bağlantı noktasında farklı ASP.NET Core uygulamalarına bağlamak için, HTTP.sys veya ııs, ngınx veya Apache gibi bir ters proxy sunucusunu kullanın.

    Uyarı

    Ters Proxy yapılandırmasında barındırma, Iletilen üstbilgiler ara yazılım yapılandırmasınıgerektirir.

  • Port numarası localhost veya bağlantı noktası numarası ile geri döngü IP 'si olan ana bilgisayar adı

    http://localhost:5000/
    http://127.0.0.1:5000/
    http://[::1]:5000/
    

    localhostBelirtildiğinde, Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerine bağlamayı dener. İstenen bağlantı noktası, herhangi bir geri döngü arabirimindeki başka bir hizmet tarafından kullanılıyorsa Kestrel başlatılamıyor. Herhangi bir geri döngü arabirimi başka bir nedenle kullanılamıyorsa (genellikle IPv6 desteklenmediği için), Kestrel bir uyarı kaydeder.

Konak filtreleme

Kestrel, Gibi önekleri temel alarak yapılandırmayı desteklerken http://example.com:5000 , büyük Kestrel ölçüde ana bilgisayar adını yoksayar. Ana bilgisayar localhost , geri döngü adreslerine bağlama için kullanılan özel bir durumdur. Açık IP adresi dışındaki tüm ana bilgisayar tüm genel IP adreslerine bağlanır. Host Üstbilgiler doğrulanmadı.

Geçici bir çözüm olarak, ana bilgisayar filtreleme ara yazılımı kullanın. ana bilgisayar filtreleme ara yazılımı, ASP.NET Core uygulamaları için örtük olarak sunulan Microsoft. aspnetcore. hostfiltering paketi tarafından sağlanır. Ara yazılım tarafından eklenir CreateDefaultBuilder ve şunları çağırır AddHostFiltering :

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Ana bilgisayar filtreleme ara yazılımı varsayılan olarak devre dışıdır. Ara yazılımı etkinleştirmek için AllowedHosts appSettings 'de bir anahtar tanımlayın appsettings.json / . <EnvironmentName> . JSON. Değer, bağlantı noktası numaraları olmayan ana bilgisayar adlarının noktalı virgülle ayrılmış listesidir:

appsettings.json:

{
  "AllowedHosts": "example.com;localhost"
}

Not

Iletilen üstbilgiler ara yazılımı da bir AllowedHosts seçenek içerir. İletilen üstbilgiler ara yazılımı ve ana bilgisayar filtreleme ara yazılımı, farklı senaryolar için benzer işlevlere sahiptir. AllowedHostsIletilen üstbilgiler ara yazılımı ile, Host istekler ters bir ara sunucu veya yük dengeleyici ile iletilirken üst bilgi korunurken, bu işlem için uygun bir ayar vardır. AllowedHostsAna bilgisayar filtreleme ara yazılımı ile ayarlandığında, Kestrel genel kullanıma yönelik bir uç sunucu olarak veya Host üst bilgi doğrudan iletildiğinde kullanılır.

Iletilen üstbilgiler ara yazılımı hakkında daha fazla bilgi için bkz Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma ..

Libuv aktarım yapılandırması

Libuv () kullanımını gerektiren projeler için UseLibuv :

  • Microsoft.AspNetCore.Server.Kestrel.Transport.LibuvUygulamanın proje dosyasına paket için bir bağımlılık ekleyin:

    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv"
                      Version="{VERSION}" />
    
  • Şunu çağırın UseLibuv IWebHostBuilder :

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseLibuv();
                    webBuilder.UseStartup<Startup>();
                });
    }
    

HTTP/1.1 istek boşaltma

HTTP bağlantılarının açılması zaman alabilir. HTTPS için de kaynak kullanımı yoğun bir işlemdir. Bu nedenle, Kestrel http/1.1 protokolü başına bağlantıları yeniden kullanmaya çalışır. Bağlantının yeniden kullanılmasına izin vermek için bir istek gövdesi tam olarak tüketilmelidir. Uygulama, POST sunucunun yeniden yönlendirme veya 404 yanıtı döndürdüğü bir istek gibi her zaman istek gövdesini tüketmez. POSTYeniden yönlendirme durumunda:

  • İstemci, verilerin bir bölümünü zaten göndermiş olabilir POST .
  • Sunucu 301 yanıtını yazar.
  • POSTÖnceki istek gövdesinden gelen veriler tam olarak okunana kadar bağlantı yeni bir istek için kullanılamaz.
  • Kestrel istek gövdesini boşaltmaya çalışır. İstek gövdesini boşaltma işlemi işlemeden verileri okuma ve atma anlamına gelir.

Boşaltma işlemi bağlantının yeniden kullanılmasına izin verme ve kalan verilerin boşaltıma süresi arasında bir ilerleme gerçekleştirir:

  • Boşaltma, yapılandırılabilir olmayan beş saniyelik bir zaman aşımına sahip olur.
  • Veya üstbilgisi tarafından belirtilen tüm veriler Content-Length Transfer-Encoding zaman aşımından önce okunmadıysa bağlantı kapatılır.

Bazen, yanıtı yazmadan önce veya sonra isteği hemen sonlandırmak isteyebilirsiniz. Örneğin, istemciler sınırlı verilerin büyük bir düzeyi olabilir, bu nedenle karşıya yüklenen verileri sınırlamak bir öncelik olabilir. Bu tür durumlarda bir isteği sonlandırmak için bir denetleyici, sayfa veya ara yazılım aracılığıyla HttpContext. Abort ' ı çağırın Razor .

Çağırmanın uyarıları vardır Abort :

  • Yeni bağlantı oluşturma yavaş ve pahalı olabilir.
  • İstemcinin bağlantı kapanmadan önce yanıtı okuduğunuzdan emin olmaz.
  • Çağırma Abort , yaygın hatalara değil önemli hata durumları için nadir ve ayrılmış olmalıdır.
    • Yalnızca Abort belirli bir sorunun çözülmesi gerektiğinde çağırın. Örneğin, Abort kötü amaçlı istemciler veri almaya çalışıyorsa POST veya istemci kodunda büyük veya çok sayıda isteğe neden olan bir hata olduğunda çağırın.
    • AbortHTTP 404 (bulunamadı) gibi yaygın hata durumları için çağrı yapmayın.

Çağrılmadan önce HttpResponse. tamamlana eşitlemesini çağırmak Abort Sunucunun yanıtı yazmayı tamamlamasını sağlar. Ancak, istemci davranışı tahmin edilebilir değildir ve bağlantı durdurulmadan önce yanıtı okuyamayabilir.

Bu işlem HTTP/2 için farklıdır çünkü protokol, bağlantıyı kapatmadan bağımsız istek akışlarını iptal etme işlemini destekler. Beş saniyelik boşaltma zaman aşımı uygulanmaz. Yanıt tamamlandıktan sonra herhangi bir okunmamış istek gövdesi verisi varsa, sunucu bir HTTP/2 RST çerçevesi gönderir. Ek istek gövdesi veri çerçeveleri yok sayılır.

Mümkünse, istemcilerin Beklenen: 100-Continue istek üst bilgisini kullanabilmesi ve istek gövdesini göndermeden önce sunucunun yanıt vermesini beklemek daha iyidir. Bu, istemciye gereksiz verileri göndermeden önce yanıtı İnceleme ve iptal etme olanağı sunar.

Ek kaynaklar

KestrelASP.NET Core için platformlar arası Web sunucusudur. Kestrel, varsayılan olarak ASP.NET Core proje şablonlarında bulunan web sunucusudur.

Kestrel aşağıdaki senaryoları destekler:

  • HTTPS
  • WebSockets 'i etkinleştirmek için kullanılan donuk yükseltme
  • NGINX 'in arkasında yüksek performans için UNIX Yuvaları
  • HTTP/2 (macOS hariç † )

†HTTP/2, gelecek sürümlerde macOS 'ta desteklenecektir.

Kestrel , .NET Core 'un desteklediği tüm platformlarda ve sürümlerde desteklenir.

Örnek kodu görüntüleme veya indirme (nasıl indirileceği)

HTTP/2 desteği

aşağıdaki temel gereksinimler karşılanıyorsa, HTTP/2 ASP.NET Core uygulamalar için kullanılabilir:

  • İşletim sistemi†
    • Windows Server 2016/Windows 10 veya üzeri‡
    • OpenSSL 1.0.2 veya üzerini içeren Linux (örneğin, Ubuntu 16,04 veya üzeri)
  • Hedef Framework: .NET Core 2,2 veya üzeri
  • Uygulama katmanı protokol anlaşması (ALPN) bağlantısı
  • TLS 1,2 veya üzeri bağlantı

†HTTP/2, gelecek sürümlerde macOS 'ta desteklenecektir. ‡KestrelWindows Server 2012 R2 ve Windows 8.1 üzerinde HTTP/2 için sınırlı destek içerir. Bu işletim sistemlerinde kullanılabilir olan desteklenen TLS şifre paketlerinin listesi sınırlı olduğundan destek sınırlıdır. TLS bağlantılarının güvenliğini sağlamak için Eliptik Eğri dijital Imza algoritması (ECDSA) kullanılarak oluşturulan bir sertifika gerekli olabilir.

Bir HTTP/2 bağlantısı kurulduysa, HttpRequest. Protocol Reports HTTP/2 .

HTTP/2 varsayılan olarak devre dışıdır. Yapılandırma hakkında daha fazla bilgi için Kestrel Options ve listenoptions. Protocols bölümlerine bakın.

KestrelTers ara sunucu ile ne zaman kullanılır?

Kestrel, kendisi veya Internet Information Services (ııs), ngınxveya Apachegibi bir ters ara sunucu ile kullanılabilir. Ters bir ara sunucu, ağdan gelen HTTP isteklerini alır ve ' a iletir Kestrel .

Kestrel sınır (Internet 'e yönelik) Web sunucusu olarak kullanılır:

::: No-Loc (Kestrel)::: ters ara sunucu olmadan doğrudan Internet ile iletişim kurar

Kestrel Ters Proxy yapılandırmasında kullanılır:

::: No-Loc (Kestrel)::: IIS, NGINX veya Apache gibi bir ters ara sunucu üzerinden Internet ile dolaylı olarak iletişim kurar

İki yapılandırma de, ters ara sunucu sunucusuyla veya olmadan, desteklenen bir barındırma yapılandırması.

Kestrel ters ara sunucu olmayan bir uç sunucu olarak kullanılması, birden çok işlem arasında aynı IP ve bağlantı noktasının paylaşılmasını desteklemez. KestrelBir bağlantı noktasını dinlemek üzere yapılandırıldığında, Kestrel istek üst bilgilerinden bağımsız olarak bu bağlantı noktası için tüm trafiği işler Host . Bağlantı noktalarını paylaşabilen bir ters proxy, istekleri Kestrel benzersiz BIR IP ve bağlantı noktası üzerinde iletme olanağına sahiptir.

Ters proxy sunucusu gerekli olmasa bile, ters proxy sunucu kullanılması iyi bir seçim olabilir.

Ters proxy:

  • , Barındırdığı uygulamaların açığa çıkarılan genel yüzey alanını sınırlayabilir.
  • Ek bir yapılandırma ve savunma katmanı sağlayın.
  • , Mevcut altyapıyla daha iyi tümleşebilir.
  • Yük dengelemeyi ve güvenli iletişim (HTTPS) yapılandırmasını kolaylaştırın. Yalnızca ters proxy sunucusu bir X. 509.440 sertifikası gerektirir ve bu sunucu, düz HTTP kullanarak, iç ağdaki uygulamanın sunucularıyla iletişim kurabilir.

Uyarı

Ters Proxy yapılandırmasında barındırma, Iletilen üstbilgiler ara yazılım yapılandırmasınıgerektirir.

KestrelASP.NET Core uygulamalarında kullanma

Microsoft. AspNetCore. Server. Kestrel paket, Microsoft.AspNetCore.app metapackage'e dahildir.

ASP.NET Core proje şablonları Kestrel varsayılan olarak kullanır. Program. cs' de, arka planda çağıran şablon kodu çağırır CreateDefaultBuilder UseKestrel .

public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

Ana bilgisayarı hakkında daha fazla bilgi için CreateDefaultBuilder , uygulamasının konak ayarlama bölümüne bakın ASP.NET Core Web ana bilgisayarı .

Çağrıldıktan sonra ek yapılandırma sağlamak için CreateDefaultBuilder şunu kullanın ConfigureKestrel :

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            // Set properties and call methods on serverOptions
        });

Uygulama, CreateDefaultBuilder Konağı kurmak için çağırmazsa, UseKestrel çağrılmadan önce çağırın ConfigureKestrel :

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseKestrel()
        .UseIISIntegration()
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            // Set properties and call methods on serverOptions
        })
        .Build();

    host.Run();
}

Kestrel Seçenekler

KestrelWeb sunucusu, Internet 'e yönelik dağıtımlarda özellikle yararlı olan kısıtlama yapılandırma seçeneklerine sahiptir.

Sınıfının özelliğinde kısıtlamaları ayarlayın Limits KestrelServerOptions . LimitsÖzelliği, sınıfının bir örneğini barındırır KestrelServerLimits .

Aşağıdaki örnekler Microsoft.AspNetCore.Server.Kestrel.Core ad alanını kullanır:

using Microsoft.AspNetCore.Server.Kestrel.Core;

Kestrel Aşağıdaki örneklerde C# kodunda yapılandırılan seçenekler, bir yapılandırma sağlayıcısıkullanılarak da ayarlanabilir. Örneğin, dosya yapılandırma sağlayıcısı Kestrel Yapılandırmayı bir appsettings.json veya appSettings 'ten yükleyebilir . { Environment}. JSON dosyası:

{
  "Kestrel": {
    "Limits": {
      "MaxConcurrentConnections": 100,
      "MaxConcurrentUpgradedConnections": 100
    }
  }
}

Aşağıdaki yaklaşımlardan birini kullanın:

  • Yapılandırma Kestrel Startup.ConfigureServices :

    1. Sınıfına bir örneği IConfiguration ekleyin Startup . Aşağıdaki örnek, eklenen yapılandırmanın özelliğe atandığını varsayar Configuration .

    2. Startup.ConfigureServices' De, Kestrel yapılandırma bölümünü yapılandırma bölümüne yükleyin Kestrel :

      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)
          {
              ...
          }
      }
      
  • KestrelKonağı oluştururken yapılandırın:

    Program. cs' de Kestrel yapılandırma bölümünü yapılandırma bölümüne yükleyin Kestrel :

    // using Microsoft.Extensions.DependencyInjection;
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureServices((context, services) =>
            {
                services.Configure<KestrelServerOptions>(
                    context.Configuration.GetSection("Kestrel"));
            })
            .UseStartup<Startup>();
    

Yukarıdaki yaklaşımların her ikisi de herhangi bir yapılandırma sağlayıcısıylaçalışır.

Etkin tut zaman aşımı

KeepAliveTimeout

Etkin tutma zaman aşımınıalır veya ayarlar. Varsayılan olarak 2 dakikadır.

.ConfigureKestrel((context, 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);
});

İstemci bağlantıları üst sınırı

MaxConcurrentConnections MaxConcurrentUpgradedConnections

En fazla eş zamanlı açık TCP bağlantısı sayısı tüm uygulama için aşağıdaki kodla ayarlanabilir:

.ConfigureKestrel((context, 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ğinde) yükseltilen bağlantılara yönelik ayrı bir sınır vardır. Bir bağlantı yükseltildikten sonra, bu sınıra göre sayılmaz MaxConcurrentConnections .

.ConfigureKestrel((context, 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ız (null).

En büyük istek gövdesi boyutu

MaxRequestBodySize

Varsayılan en büyük istek gövdesi boyutu 30.000.000 bayttır ve bu değer 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, RequestSizeLimitAttribute bir eylem yönteminde özniteliğini kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Her istekte uygulama için kısıtlamanın nasıl yapılandırılacağını gösteren bir örnek aşağıda verilmiştir:

.ConfigureKestrel((context, 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ım içindeki belirli bir istek üzerindeki 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 bir istek üzerindeki sınırı yapılandırırsa, bir özel durum oluşturulur. IsReadOnlyÖzelliğin salt okuma durumunda olup olmadığını belirten bir özellik vardır. Bu, MaxRequestBodySize sınırı yapılandırmanın çok geç olduğunu gösterir.

bir uygulama ASP.NET Core modülününarkasında çalıştırıldığında , Kestrel ııs sınırı zaten ayarladığı için istek gövdesi boyut sınırı devre dışı bırakılır.

En az istek gövdesi veri hızı

MinRequestBodyDataRate MinResponseDataRate

Kestrel veriler belirtilen hızda bayt/saniye olarak ulaşan her saniye bir denetler. Oran en düşük değerin altına düşerse bağlantı zaman aşımına uğrar. Yetkisiz kullanım süresi, Kestrel istemcinin gönderme hızını en düşüye artırması için gereken süredir. bu süre boyunca fiyat denetlenmez. Yetkisiz kullanım süresi, TCP yavaş başlatma nedeniyle başlangıçta verileri yavaş bir hızda gönderen bağlantıların bırakılmasını önlemeye yardımcı olur.

Varsayılan en düşük oran, 5 saniyelik bir yetkisiz kullanım süresi ile 240 bayt/saniye olur.

Yanıt için bir minimum oran da geçerlidir. İstek sınırını ayarlamaya yönelik kod ve yanıt sınırı, RequestBody Response özellik ve arabirim adlarında olduğu gibi aynı olur.

İşte, program. cs' de en düşük veri hızlarının nasıl yapılandırılacağını gösteren bir örnek:

.ConfigureKestrel((context, 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ım içindeki istek başına düşen minimum 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));
    }

HttpContext.Featuresİstek çoğullama için protokol desteği nedeniyle, http/2 için bir istek başına hız sınırlarını değiştirmek, http/2 istekleri için, önceki örnekte başvurulan hiçbir oran özelliği mevcut değil. KestrelServerOptions.LimitsHttp/1. x ve http/2 bağlantılarına hala uygulanan sunucu genelindeki hız sınırları.

İstek üst bilgileri zaman aşımı

RequestHeadersTimeout

Sunucunun istek üst bilgilerini alması için harcadığı en uzun süreyi alır veya ayarlar. Varsayılan değer 30 saniyedir.

.ConfigureKestrel((context, 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);
});

Bağlantı başına en fazla akış

Http2.MaxStreamsPerConnection HTTP/2 bağlantısı başına eşzamanlı istek akışı sayısını sınırlar. Fazlalık akışlar reddedildi.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, 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. Http2.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.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.Limits.Http2.HeaderTableSize = 4096;
        });

Varsayılan değer 4096'dır.

En büyük çerçeve boyutu

Http2.MaxFrameSize , alacak HTTP/2 bağlantı çerçevesi yükünün maksimum 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.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.Limits.Http2.MaxFrameSize = 16384;
        });

Varsayılan değer 2^14 'tir (16.384).

En büyük istek üst bilgisi boyutu

Http2.MaxRequestHeaderFieldSize , istek ü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.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
        });

Varsayılan değer 8.192'dir.

İlk bağlantı penceresi boyutu

Http2.InitialConnectionWindowSize , 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'e eşit veya daha büyük ve 2^31'den (2.147.483.648) küçük olması gerekir.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
        });

Varsayılan değer 128 KB'tır (131.072).

İlk akış penceresi boyutu

Http2.InitialStreamWindowSize , istek (akış) başına bir defada sunucu arabelleklerinin 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'e eşit veya daha büyük ve 2^31'den (2.147.483.648) küçük olması gerekir.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
        });

Varsayılan değer 96 KB'tır (98.304).

Zaman Uyumlu G/Ç

AllowSynchronousIO , istek ve yanıt için zaman uyumlu bir I/O'ya izin verili olup olmadığını kontrol eder. Varsayılan değer: true .

Uyarı

Çok sayıda engelleme zaman uyumlu I/O işlemleri iş parçacığı havuzu açlıklarına neden olabilir ve bu da uygulamanın yanıt vermemeye neden olur. Yalnızca AllowSynchronousIO zaman uyumsuz I/O'yi desteklemez bir kitaplık kullanırken etkinleştirin.

Aşağıdaki örnek zaman uyumlu I/O'yi sağlar:

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

Diğer seçenekler ve sınırlar Kestrel hakkında bilgi için bkz:

Uç nokta yapılandırması

Varsayılan olarak, ASP.NET Core şu bağlantılara bağlanıyor:

  • http://localhost:5000
  • https://localhost:5001 (yerel bir geliştirme sertifikası mevcut olduğunda)

Şu url'leri kullanarak URL'leri belirtin:

  • ASPNETCORE_URLS ortam değişkeni.
  • --urls komut satırı bağımsız değişkeni.
  • urls konak yapılandırma anahtarı.
  • UseUrls extension yöntemi.

Bu yaklaşımlar kullanılarak sağlanan değer bir veya daha fazla HTTP ve HTTPS uç noktası (varsayılan sertifika varsa HTTPS) olabilir. Değeri noktalı virgülle ayrılmış liste (örneğin, ) olarak "Urls": "http://localhost:8000;http://localhost:8001" yapılandırma.

Bu yaklaşımlar hakkında daha fazla bilgi için bkz. Sunucu URL'leri ve Geçersiz Kılma yapılandırması.

Bir geliştirme sertifikası oluşturulur:

Bazı tarayıcıların yerel geliştirme sertifikasına güvenmesi için açık izin verilmesi gerekir.

Project şablonları, uygulamaları varsayılan olarak HTTPS üzerinde çalıştıracak şekilde yapılandırarak HTTPS yeniden yönlendirme ve HSTS desteği içerir.

URL Listen ön ListenUnixSocket eklerini ve bağlantı noktalarını yapılandırmak için çağrısı KestrelServerOptions veya Kestrel yöntemleri.

UseUrls, komut satırı bağımsız değişkeni, konak yapılandırma anahtarı ve ortam değişkeni de çalışır, ancak bu bölümün ilerleyen kısımlarında (HTTPS uç noktası yapılandırması için varsayılan sertifikanın kullanılabilir olması --urls urls ASPNETCORE_URLS gerekir) sınırlamalara sahiptir.

KestrelServerOptions Yapılandırma:

ConfigureEndpointDefaults(Eylem <ListenOptions> )

Belirtilen her uç nokta Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureEndpointDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ConfigureEndpointDefaults(listenOptions =>
            {
                // Configure endpoint defaults
            });
        });

Not

Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureEndpointDefaults uç noktaların varsayılan değerleri uygulanmaz.

ConfigureHttpsDefaults(Eylem <HttpsConnectionAdapterOptions> )

Her HTTPS uç noktası Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureHttpsDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ConfigureHttpsDefaults(listenOptions =>
            {
                // certificate is an X509Certificate2
                listenOptions.ServerCertificate = certificate;
            });
        });

Not

Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureHttpsDefaults uç noktaların varsayılan değerleri uygulanmaz.

Configure(IConfiguration)

Giriş olarak alan bir ayar için Kestrel bir yapılandırma IConfiguration yükleyicisi oluşturur. Yapılandırmanın kapsamı için yapılandırma bölümü olarak Kestrel genişletildi.

ListenOptions.UseHttps

KestrelHTTPS kullanmak için yapılandırma.

ListenOptions.UseHttps Uzantı -ları:

  • UseHttps: Varsayılan Kestrel sertifika ile HTTPS kullanmak üzere yapılandırma. Varsayılan sertifika yapılandırılmamışsa bir özel durum oluşturur.
  • UseHttps(string fileName)
  • UseHttps(string fileName, string password)
  • UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(StoreName storeName, string subject)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(X509Certificate2 serverCertificate)
  • UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)

ListenOptions.UseHttps Parametre:

  • filename , uygulamanın içerik dosyalarını içeren dizine göre bir sertifika dosyasının yolu ve dosya adıdır.
  • password , X.509 sertifika verilerine erişmek için gereken paroladır.
  • configureOptions, yapılandırmak Action için bir 'dır. HttpsConnectionAdapterOptions döndürür. ListenOptions
  • storeName , sertifikanın yükln olduğu sertifika deposu.
  • subject , sertifikanın konu adıdır.
  • allowInvalid , otomatik olarak imzalanan sertifikalar gibi geçersiz sertifikaların dikkate alınmalıdır.
  • location , sertifikanın yükln olduğu depo konumu.
  • serverCertificate X.509 sertifikasıdır.

Üretimde HTTPS'nin açıkça yapılandırılması gerekir. En azından, varsayılan bir sertifika sağlanmalıdır.

Bundan sonra açıklanan desteklenen yapılandırmalar:

  • Yapılandırma yok
  • Yapılandırmadan varsayılan sertifikayı değiştirme
  • Kodda varsayılanları değiştirme

Yapılandırma yok

Kestrel ve http://localhost:5000 (varsayılan https://localhost:5001 bir sertifika varsa) dinler.

Yapılandırmadan varsayılan sertifikayı değiştirme

CreateDefaultBuilder varsayılan Configure(context.Configuration.GetSection("Kestrel")) olarak yük yapılandırmasına Kestrel çağrır. için varsayılan bir HTTPS uygulama ayarları yapılandırma şeması Kestrel mevcuttur. Disk veya sertifika depolama alanı üzerinde bulunan bir dosyadan, URL'ler ve kullanmak üzere sertifikalar dahil olmak üzere birden çok uç nokta yapılandırma.

Aşağıdaki appsettings.json örnekte:

  • AllowInvalid'i geçersiz sertifikaların (örneğin, otomatik olarak imzalanan sertifikalar) kullanımına true izin verecek şekilde ayarlayın.
  • Sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte HttpsDefaultCert), Sertifikalar Varsayılan veya geliştirme sertifikası altında tanımlanan sertifikaya > geri döner.
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:5000"
      },

      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      },

      "HttpsInlineCertStore": {
        "Url": "https://localhost:5002",
        "Certificate": {
          "Subject": "<subject; required>",
          "Store": "<certificate store; required>",
          "Location": "<location; defaults to CurrentUser>",
          "AllowInvalid": "<true or false; defaults to false>"
        }
      },

      "HttpsDefaultCert": {
        "Url": "https://localhost:5003"
      },

      "Https": {
        "Url": "https://*:5004",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    },
    "Certificates": {
      "Default": {
        "Path": "<path to .pfx file>",
        "Password": "<certificate password>"
      }
    }
  }
}

Herhangi bir sertifika düğümü için Yol ve Parola kullanmanın alternatifi, sertifika depolama alanlarını kullanarak sertifikayı belirtmektir. Örneğin, Sertifikalar > Varsayılan sertifikası şu şekilde belirtilebilir:

"Default": {
  "Subject": "<subject; required>",
  "Store": "<cert store; required>",
  "Location": "<location; defaults to CurrentUser>",
  "AllowInvalid": "<true or false; defaults to false>"
}

Şema notları:

  • Uç nokta adları büyük/büyük/büyük harfe duyarlı değildir. Örneğin, HTTPS ve Https geçerlidir.
  • parametresi Url her uç nokta için gereklidir. Bu parametrenin biçimi, tek bir değerle sınırlı olması dışında üst düzey Urls yapılandırma parametresiyle aynıdır.
  • Bu uç noktalar, bunlara eklemek yerine üst düzey Urls yapılandırmada tanımlananların yerini almaktadır. aracılığıyla kodda tanımlanan uç Listen noktalar, yapılandırma bölümünde tanımlanan uç noktalarla biriktir.
  • bölümü Certificate isteğe bağlıdır. CertificateBölüm belirtilmemişse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Kullanılabilir varsayılan değer yoksa, sunucu bir özel durum oluşturur ve başlayamaz.
  • Bu Certificate bölüm hem yolparolasını hem de Konudeposu sertifikalarını destekler.
  • Herhangi bir sayıda uç nokta, bağlantı noktası çakışmalarına neden olmadıkları sürece bu şekilde tanımlanabilir.
  • options.Configure(context.Configuration.GetSection("{SECTION}")) yapılandırılmış bir KestrelConfigurationLoader .Endpoint(string name, listenOptions => { }) uç noktanın ayarlarını tamamlamak için kullanılabilecek bir yöntemi olan bir döndürür:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel((context, serverOptions) =>
        {
            serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
                .Endpoint("HTTPS", listenOptions =>
                {
                    listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
                });
        });

KestrelServerOptions.ConfigurationLoader , tarafından sağlana gibi var olan yükleyicisindeki yinelemeye devam etmek için doğrudan erişilebilir CreateDefaultBuilder .

  • Her uç noktanın yapılandırma bölümü, Endpoint özel ayarların okunabilmesi için yöntemindeki seçeneklerde kullanılabilir.
  • Birden çok yapılandırma, options.Configure(context.Configuration.GetSection("{SECTION}")) başka bir bölümle yeniden çağırarak yüklenebilir. Önceki örneklerde açıkça çağrılmadığı takdirde, yalnızca son yapılandırma kullanılır Load . Metapackage, Load varsayılan yapılandırma bölümünün değiştirilmesini sağlayacak şekilde çağırmıyor.
  • KestrelConfigurationLoader``ListenAPI ailesini KestrelServerOptions Endpoint aşırı yükleme olarak yansıtır, bu nedenle kod ve yapılandırma uç noktaları aynı yerde yapılandırılabilir. Bu aşırı yüklemeler adları kullanmaz ve yalnızca yapılandırmadan varsayılan ayarları kullanır.

Koddaki varsayılanları değiştirme

ConfigureEndpointDefaults ve ConfigureHttpsDefaults ListenOptions HttpsConnectionAdapterOptions , önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma dahil, ve için varsayılan ayarları değiştirmek üzere kullanılabilir. ConfigureEndpointDefaults ve ConfigureHttpsDefaults herhangi bir uç nokta yapılandırılmadan önce çağrılmalıdır.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel((context, serverOptions) =>
        {
            serverOptions.ConfigureEndpointDefaults(listenOptions =>
            {
                // Configure endpoint defaults
            });

            serverOptions.ConfigureHttpsDefaults(listenOptions =>
            {
                listenOptions.SslProtocols = SslProtocols.Tls12;
            });
        });

Kestrel SNı desteği

Sunucu adı belirtme (SNı) , aynı IP adresi ve bağlantı noktası üzerinde birden fazla etki alanını barındırmak için kullanılabilir. SNı 'nin çalışması için, istemci, TLS el sıkışması sırasında güvenli oturum ana bilgisayar adını, sunucunun doğru sertifikayı sağlayabilmesi için gönderir. İstemci, TLS anlaşmasını izleyen güvenli oturum sırasında sunucuyla şifreli iletişim için bulunan sertifikayı kullanır.

Kestrel geri çağırma aracılığıyla SNı 'yi destekler ServerCertificateSelector . Geri çağırma, uygulamanın ana bilgisayar adını incelemesine ve uygun sertifikayı seçmesini sağlamak için bağlantı başına bir kez çağrılır.

SNı desteği şunları gerektirir:

  • Hedef Framework netcoreapp2.1 veya sonraki sürümlerde çalışıyor. net461Veya sonraki sürümlerde, geri çağırma çağrılır, ancak name her zaman olur null . nameAyrıca, null ISTEMCI, TLS el sıkışmasının ana bilgisayar adı parametresini sağlamıyorsa de olur.
  • Tüm Web siteleri aynı örnek üzerinde çalışır Kestrel . Kestrel , bir IP adresinin ve bağlantı noktasının bir ters proxy olmadan birden çok örnek arasında paylaşılmasını desteklemez.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ListenAnyIP(5005, listenOptions =>
            {
                listenOptions.UseHttps(httpsOptions =>
                {
                    var localhostCert = CertificateLoader.LoadFromStoreCert(
                        "localhost", "My", StoreLocation.CurrentUser,
                        allowInvalid: true);
                    var exampleCert = CertificateLoader.LoadFromStoreCert(
                        "example.com", "My", StoreLocation.CurrentUser,
                        allowInvalid: true);
                    var subExampleCert = CertificateLoader.LoadFromStoreCert(
                        "sub.example.com", "My", StoreLocation.CurrentUser,
                        allowInvalid: true);
                    var certs = new Dictionary<string, X509Certificate2>(
                        StringComparer.OrdinalIgnoreCase);
                    certs["localhost"] = localhostCert;
                    certs["example.com"] = exampleCert;
                    certs["sub.example.com"] = subExampleCert;

                    httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
                    {
                        if (name != null && certs.TryGetValue(name, out var cert))
                        {
                            return cert;
                        }

                        return exampleCert;
                    };
                });
            });
        });

Bağlantı günlüğü

UseConnectionLoggingBir bağlantıda bayt düzeyinde iletişim Için hata ayıklama düzeyi günlüklerini yayma çağrısı. Bağlantı günlüğü, TLS şifreleme ve proxy 'nin arkasındaki gibi alt düzey iletişimde sorunları gidermeye yardımcı olur. UseConnectionLoggingDaha önce yerleştirilmişse UseHttps , şifrelenmiş trafik günlüğe kaydedilir. UseConnectionLoggingÖğesinden sonra yerleştirilmişse UseHttps , şifresi çözülmüş trafik günlüğe kaydedilir.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.UseConnectionLogging();
    });
});

TCP yuvasına bağlama

ListenYöntemi BIR TCP yuvasına bağlanır ve bir seçenek lambda X. 509.440 sertifika yapılandırmasına izin verir:

public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.Listen(IPAddress.Loopback, 5000);
            serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
            {
                listenOptions.UseHttps("testCert.pfx", "testPassword");
            });
        });

Örnek, HTTPS 'yi ile bir uç nokta için yapılandırır ListenOptions . Belirli uç noktalara yönelik diğer ayarları yapılandırmak için aynı API 'yi kullanın Kestrel .

Windows 'da, otomatik olarak imzalanan sertifikalar New-SelfSignedCertificate PowerShell cmdlet 'ikullanılarak oluşturulabilir. Desteklenmeyen bir örnek için bkz. UpdateIISExpressSSLForChrome.ps1.

MacOS, Linux ve Windows 'da, Sertifikalar OpenSSLkullanılarak oluşturulabilir.

UNIX yuvasına bağlama

ListenUnixSocketAşağıdaki örnekte gösterildiği gibi NGINX ile gelişmiş performans için ile birlikte bir UNIX yuvası dinleyin:

.ConfigureKestrel((context, serverOptions) =>
{
    serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
    serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock", listenOptions =>
    {
        listenOptions.UseHttps("testCert.pfx", "testpassword");
    });
});
  • NGINX confiuguration dosyasında, server > location > proxy_pass girdisini olarak ayarlayın http://unix:/tmp/{KESTREL SOCKET}:/; . {KESTREL SOCKET} , için belirtilen yuvanın adıdır ListenUnixSocket (örneğin, kestrel-test.sock Önceki örnekte).
  • Yuvanın NGINX tarafından yazılabilir olduğundan emin olun (örneğin, chmod go+w /tmp/kestrel-test.sock ).

Bağlantı noktası 0

Bağlantı noktası numarası 0 belirtildiğinde, Kestrel dinamik olarak kullanılabilir bir bağlantı noktasına bağlanır. Aşağıdaki örnek, çalışma zamanında gerçekten hangi bağlantı noktasının bağlandığını nasıl belirleyeceğini göstermektedir Kestrel :

public void Configure(IApplicationBuilder app)
{
    var serverAddressesFeature = 
        app.ServerFeatures.Get<IServerAddressesFeature>();

    app.UseStaticFiles();

    app.Run(async (context) =>
    {
        context.Response.ContentType = "text/html";
        await context.Response
            .WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
                "<title></title></head><body><p>Hosted by Kestrel</p>");

        if (serverAddressesFeature != null)
        {
            await context.Response
                .WriteAsync("<p>Listening on the following addresses: " +
                    string.Join(", ", serverAddressesFeature.Addresses) +
                    "</p>");
        }

        await context.Response.WriteAsync("<p>Request URL: " +
            $"{context.Request.GetDisplayUrl()}<p>");
    });
}

Uygulama çalıştırıldığında konsol penceresi çıkışı, uygulamanın erişilebileceği dinamik bağlantı noktasını gösterir:

Listening on the following addresses: http://127.0.0.1:48508

Sınırlamalar

Aşağıdaki yaklaşımlar ile uç noktaları yapılandırın:

  • UseUrls
  • --urls komut satırı bağımsız değişkeni
  • urls Ana bilgisayar yapılandırma anahtarı
  • ASPNETCORE_URLS ortam değişkeni

Bu yöntemler, kodun dışındaki sunucularla kod çalışmasını sağlamak için yararlıdır Kestrel . Ancak, aşağıdaki sınırlamalara dikkat edin:

  • HTTPS uç noktası yapılandırmasında varsayılan bir sertifika sağlanmadığı sürece HTTPS bu yaklaşımlar ile kullanılamaz (örneğin, KestrelServerOptions Bu konunun önceki kısımlarında gösterildiği gibi yapılandırma veya yapılandırma dosyası kullanılıyor).
  • Hem hem de Listen UseUrls yaklaşımları aynı anda kullanıldığında, uç noktalar Listen UseUrls uç noktaları geçersiz kılar.

IIS uç nokta yapılandırması

IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya ya da tarafından ayarlanır Listen UseUrls . daha fazla bilgi için ASP.NET Core modülü konusuna bakın.

ListenOptions. Protocols

ProtocolsÖzelliği, HttpProtocols bir bağlantı uç noktasında veya sunucu IÇIN etkin HTTP protokollerini () belirler. ProtocolsSabit listesinden özelliğe bir değer atayın HttpProtocols .

HttpProtocols sabit listesi değeri Bağlantı protokolü izin verildi
Http1 Yalnızca HTTP/1.1. , TLS olmadan veya ile kullanılabilir.
Http2 Yalnızca HTTP/2. Yalnızca istemci önceki bir bilgi modunuDESTEKLIYORSA, TLS olmadan kullanılabilir.
Http1AndHttp2 HTTP/1.1 ve HTTP/2. HTTP/2 bir TLS ve uygulama katmanı protokol anlaşması (ALPN) bağlantısı gerektirir; Aksi takdirde, bağlantı varsayılan olarak HTTP/1.1 ' dir.

Varsayılan protokol HTTP/1.1 ' dir.

HTTP/2 için TLS kısıtlamaları:

  • TLS sürüm 1,2 veya üzeri
  • Yeniden anlaşma devre dışı
  • Sıkıştırma devre dışı
  • En az kısa ömürlü anahtar değişim boyutları:
    • Eliptik Eğri Diffie-Hellman (ECDHE) [ RFC4492 ] : 224 bit minimum
    • Sınırlı alan Diffie-Hellman (DHE) [ TLS12 ] : 2048 bit minimum
  • Şifre paketi engellenmedi

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256[TLS-ECDHE] P-256 eliptik eğrisi [ FIPS186 ] Varsayılan olarak desteklenir.

Aşağıdaki örnek, 8000 numaralı bağlantı noktasında HTTP/1.1 ve HTTP/2 bağlantılarına izin verir. Bağlantılar, sağlanan bir sertifikayla TLS ile güvenlidir:

.ConfigureKestrel((context, serverOptions) =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
        listenOptions.UseHttps("testCert.pfx", "testPassword");
    });
});

İsteğe bağlı olarak, IConnectionAdapter belirli şifrelemeler için bağlantı BAŞıNA TLS el sıkışmaları filtrelemek üzere bir uygulama oluşturun:

.ConfigureKestrel((context, serverOptions) =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
        listenOptions.UseHttps("testCert.pfx", "testPassword");
        listenOptions.ConnectionAdapters.Add(new TlsFilterAdapter());
    });
});
private class TlsFilterAdapter : IConnectionAdapter
{
    public bool IsHttps => false;

    public Task<IAdaptedConnection> OnConnectionAsync(ConnectionAdapterContext context)
    {
        var tlsFeature = context.Features.Get<ITlsHandshakeFeature>();

        // Throw NotSupportedException for any cipher algorithm that the app doesn't
        // wish to support. Alternatively, define and compare
        // ITlsHandshakeFeature.CipherAlgorithm to a list of acceptable cipher
        // suites.
        //
        // No encryption is used with a CipherAlgorithmType.Null cipher algorithm.
        if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
        {
            throw new NotSupportedException("Prohibited cipher: " + tlsFeature.CipherAlgorithm);
        }

        return Task.FromResult<IAdaptedConnection>(new AdaptedConnection(context.ConnectionStream));
    }

    private class AdaptedConnection : IAdaptedConnection
    {
        public AdaptedConnection(Stream adaptedStream)
        {
            ConnectionStream = adaptedStream;
        }

        public Stream ConnectionStream { get; }

        public void Dispose()
        {
        }
    }
}

Protokolü yapılandırmadan ayarla

CreateDefaultBuilderserverOptions.Configure(context.Configuration.GetSection("Kestrel"))yapılandırmayı yüklemek için varsayılan olarak çağırır Kestrel .

Aşağıdaki appsettings.json örnekte, tüm uç noktaları için varsayılan bir bağlantı protokolü (http/1.1 ve http/2) oluşturulmuştur Kestrel :

{
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http1AndHttp2"
    }
  }
}

Aşağıdaki yapılandırma dosyası örneği, belirli bir uç nokta için bağlantı protokolü oluşturur:

{
  "Kestrel": {
    "Endpoints": {
      "HttpsDefaultCert": {
        "Url": "https://localhost:5001",
        "Protocols": "Http1AndHttp2"
      }
    }
  }
}

Yapılandırma tarafından ayarlanan kod geçersiz kılma değerlerinde belirtilen protokoller.

Libuv aktarım yapılandırması

ASP.NET Core 2,1 ' nin yayınlanmasıyla birlikte, Kestrel varsayılan aktarım artık libuv ' d i temel değildir ancak bunun yerine yönetilen yuvaları temel alır. bu, çağrıyı yapan ve aşağıdaki paketlerden birine bağlı olan ASP.NET Core 2,0 2,1 uygulamalarının önemli bir değişikliği olur UseLibuv :

Libuv kullanımını gerektiren projeler için:

URL önekleri

UseUrls, --urls Komut satırı bağımsız değişkeni, urls ana bilgisayar yapılandırma anahtarı veya ASPNETCORE_URLS ortam değişkeni kullanılırken, URL önekleri aşağıdaki biçimlerden birinde olabilir.

Yalnızca HTTP URL ön ekleri geçerlidir. Kestrel , kullanılarak URL bağlamaları yapılandırılırken HTTPS 'YI desteklemez UseUrls .

  • Bağlantı noktası numarası olan IPv4 adresi

    http://65.55.39.10:80/
    

    0.0.0.0 , tüm IPv4 adreslerine bağlanan özel bir durum değildir.

  • Bağlantı noktası numarasına sahip IPv6 adresi

    http://[0:0:0:0:0:ffff:4137:270a]:80/
    

    [::], IPv4'e eşdeğer olan IPv6'dır. 0.0.0.0

  • Bağlantı noktası numarası ile ana bilgisayar adı

    http://contoso.com:80/
    http://*:80/
    

    Konak adları * , ve özel + değil. Geçerli bir IP adresi olarak tanınmaz veya tüm localhost IPv4 ve IPv6 IP'lere bağlanabilir. Aynı bağlantı noktası üzerinde farklı ASP.NET Core ana bilgisayar adlarını bağlamak için iis, Nginx veya Apache HTTP.sys bir ters ara sunucu kullanın.

    Uyarı

    Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.

  • Bağlantı localhost noktası numarasına veya bağlantı noktası numarasına sahip geri döngü IP'sini olan ana bilgisayar adı

    http://localhost:5000/
    http://127.0.0.1:5000/
    http://[::1]:5000/
    

    localhostBelirtilirse, Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerini bağlamaya çalışır. İstenen bağlantı noktası herhangi bir geri döngü arabiriminde başka bir hizmet tarafından kullanıyorsa Kestrel başlatamaz. Herhangi bir geri döngü arabirimi başka bir nedenle kullanılamıyorsa (en yaygın olarak IPv6 desteklanmamaktadır), Kestrel bir uyarı günlüğe kaydeder.

Konak filtreleme

gibi Kestrel ön eklere göre yapılandırmayı http://example.com:5000 desteklerken, Kestrel ana bilgisayar adını büyük ölçüde yoksayar. Konak, localhost geri döngü adreslerine bağlama için kullanılan özel bir durum. Açık BIR IP adresi dışında herhangi bir konak tüm genel IP adreslerine bağlar. Host üst bilgiler doğrulanmaz.

Geçici bir çözüm olarak, Konak Filtreleme Ara Yazılımı'ı kullanın. Konak Filtreleme Ara Yazılımı, Microsoft.AspNetCore.App meta paketine (ASP.NET Core 2.1 veya 2.2) dahil edilen Microsoft.AspNetCore.HostFiltering paketi tarafından sağlanır. ara yazılımı tarafından eklenir CreateDefaultBuilder ve bu da çağrısında dır: AddHostFiltering

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Konak Filtreleme Ara Yazılımı varsayılan olarak devre dışıdır. Ara yazılımı etkinleştirmek için AllowedHosts appsettings.json / appsettings içinde bir anahtar tanımlayın. <EnvironmentName> . json. Değer, bağlantı noktası numaraları olmayan noktalı virgülle ayrılmış konak adları listesidir:

appsettings.json:

{
  "AllowedHosts": "example.com;localhost"
}

Not

Iletili Üst Bilgiler Ara Yazılımı'nın da bir seçeneği AllowedHosts vardır. Iletili Üst Bilgiler Ara Yazılımı ve Konak Filtreleme Ara Yazılımı, farklı senaryolar için benzer işlevlere sahip olur. bir ters ara sunucu veya yük dengeleyici ile istekleri iletirken üst bilgi korunmazsa, Iletili Üst Bilgiler Ara Yazılımı AllowedHosts Host ayarı uygundur. Ana Bilgisayar Filtreleme Ara Yazılımı ayarı, genel olarak kullanılan uç sunucu olarak veya üst bilgi doğrudan AllowedHosts Kestrel Host iletildi olduğunda uygundur.

Iletili Üst Bilgiler Ara Yazılımı hakkında daha fazla bilgi için bkz. Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma .

HTTP/1.1 isteği boşaltma

HTTP bağlantılarının açılması zaman alır. HTTPS için de yoğun kaynak kullanır. Bu Kestrel nedenle, HTTP/1.1 protokolü başına bağlantıları yeniden kullanır. Bağlantının yeniden kullanılması için bir istek gövdesi tam olarak tüketilmelidir. Uygulama, sunucunun yeniden yönlendirme veya 404 yanıtı döndüren istekler gibi istek gövdesini her POST zaman tüketmez. POST-redirect durumunda:

  • İstemci verilerin bir kısmını zaten göndermüş POST olabilir.
  • Sunucu 301 yanıtını yazar.
  • Önceki istek gövdesinden veriler tam olarak okunana kadar POST bağlantı yeni bir istek için kullanılamaz.
  • Kestrel , istek gövdeyi boşaltmaya çalışır. İstek gövdeyi boşaltmak, verileri işlemeden okumak ve atmak anlamına gelir.

Boşaltma işlemi, bağlantının yeniden kullanılmasına izin verme ve kalan verileri boşaltma süresi arasında bir geçiş yapar:

  • Boşaltmanın beş saniyelik zaman aşımı vardır ve bu zaman aşımı yapılandırılabilir değildir.
  • Veya üst bilgisi tarafından belirtilen tüm veriler zaman aşımından önce Content-Length Transfer-Encoding okunmamışsa bağlantı kapatılır.

Bazen yanıtı yazmadan önce veya yazdıktan sonra isteği hemen sonlandırmak istiyor olabilir. Örneğin, istemciler kısıtlayıcı veri sınırlara sahip olabilir, dolayısıyla karşıya yüklenen verileri sınırlamak bir öncelik olabilir. Böyle durumlarda bir isteği sonlandırmak için denetleyiciden, Sayfadan veya ara yazılımdan HttpContext.Abort Razor çağrısında bulunabilirsiniz.

çağrısında uyarılar Abort vardır:

  • Yeni bağlantılar oluşturmak yavaş ve pahalı olabilir.
  • Bağlantı kapanmadan önce istemcinin yanıtı okuduğu garanti edilemez.
  • Arama Abort nadir olmalı ve sık karşılaşılan hatalar için değil ciddi hata durumlarına ayrılmıştır.
    • Yalnızca belirli Abort bir sorunun çözülmesi gerekirken çağrısı. Örneğin, kötü amaçlı istemciler verileri almaya çalışıyorsa veya istemci kodunda büyük veya çok sayıda i isteğine neden olan bir hata Abort POST olduğunda çağrısı.
    • AbortHTTP 404 (Bulunamadı) gibi yaygın hata durumlarını çağırmayın.

Çağırmadan önce HttpResponse.CompleteAsync çağrısı Abort yapılması, sunucunun yanıtı yazmayı tamamlamış olması sağlar. Ancak istemci davranışı tahmin edilebilir değildir ve bağlantı durdurulmadan önce yanıtı okuyamaz.

Protokol, bağlantıyı kapatmadan tek tek istek akışlarını durdurmayı desteklediği için bu işlem HTTP/2 için farklıdır. Beş saniyelik boşaltma zaman aşımı geçerli değildir. Yanıt tamamladıktan sonra okunmamış istek gövdesi verileri varsa sunucu bir HTTP/2 RST çerçevesi gönderir. Ek istek gövdesi veri çerçeveleri yoksayılır.

Mümkünse, istemcilerin Expect: 100-continue istek üst bilgisinden faydalanmaları ve istek gövdelerini göndermeye başlamadan önce sunucunun yanıt vermelerini beklemeleri daha iyidir. Bu, istemciye, gerekmeden veri göndermeden önce yanıtı inceleme ve durdurma fırsatı verir.

Ek kaynaklar

Kestrel, için platformlar arası bir web ASP.NET Core. Kestrel, proje şablonlarına varsayılan olarak dahil ASP.NET Core sunucusudur.

Kestrel aşağıdaki senaryoları destekler:

  • HTTPS
  • WebSockets'i etkinleştirmek için kullanılan opak yükseltme
  • Nginx'in arkasında yüksek performans için Unix yuvaları

Kestrel , .NET Core'un desteklediği tüm platformlarda ve sürümlerde de desteklemektedir.

Örnek kodu görüntüleme veya indirme ( nasılindir)

Ters ara sunucu Kestrel ile ne zaman kullanmalı?

Kestreltek başına veya Internet Information Services (IIS) , Nginxveya Apache gibi bir ters proxy sunucusu ile kullanılabilir. Ters ara sunucu, ağdan HTTP isteklerini alır ve bu istekleri adresine Kestrel iletir.

Kestrel uç (İnternet'e yönelik) web sunucusu olarak kullanılır:

Kestrel ters ara sunucu olmadan doğrudan İnternet ile iletişim kurar

Kestrel ters ara sunucu yapılandırmasında kullanılır:

Kestrel IIS, Nginx veya Apache gibi bir ters ara sunucu üzerinden dolaylı olarak İnternet ile iletişim kurar

Ters proxy sunucusu olan veya olmayan yapılandırma desteklenen bir barındırma yapılandırmasıdır.

Kestrel ters proxy sunucusu olmayan bir uç sunucu olarak kullanılır, aynı IP ve bağlantı noktasının birden çok işlem arasında paylaşımını desteklemez. Bir bağlantı noktasını dinleyecek şekilde yapılandırıldığında, isteklerin üst bilgilerden bağımsız olarak bu Kestrel bağlantı noktası için tüm trafiği Kestrel Host işler. Bağlantı noktalarını paylaştıran bir ters ara sunucu, istekleri benzersiz bir IP ve Kestrel bağlantı noktası üzerinde adresine iletebilir.

Ters ara sunucu gerekli değilse bile, ters ara sunucu kullanmak iyi bir seçenek olabilir.

Ters ara sunucu:

  • Barındır olduğu uygulamaların açık genel yüzey alanı sınırlayıcı olabilir.
  • Ek bir yapılandırma ve savunma katmanı sağlama.
  • Var olan altyapıyla daha iyi tümleştiri olabilir.
  • Yük dengelemeyi ve güvenli iletişim (HTTPS) yapılandırmasını basitleştirin. Yalnızca ters ara sunucu bir X.509 sertifikası gerektirir ve bu sunucu, düz HTTP kullanarak iç ağ üzerinde uygulamanın sunucularıyla iletişim kurabilir.

Uyarı

Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.

Uygulama Kestrel uygulamalarında ASP.NET Core kullanma

Microsoft.AspNetCore.Server. Kestrel paketi, meta Microsoft.AspNetCore.App dahil edilir.

ASP.NET Core proje şablonları varsayılan Kestrel olarak kullanılır. Program.cs'de şablon CreateDefaultBuilder kodu, arka sahneyi UseKestrel çağıran çağrısında bulundu.

çağrısından sonra ek yapılandırma sağlamak CreateDefaultBuilder için çağrısında UseKestrel arayın:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            // Set properties and call methods on serverOptions
        });

Konak hakkında daha CreateDefaultBuilder fazla bilgi için, 'nin Konak ayarlama bölümüne ASP.NET Core Web ana bilgisayarı bakın.

Kestrel Seçenekler

Web Kestrel sunucusunun, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçenekleri vardır.

sınıfının özelliği Limits üzerinde 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;

Kestrelaşağıdaki örneklerde C# kodunda yapılandırılan seçenekler, 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 appsettings.json appsettings'den yapılandırmayı yükleyemedi.{ Environment}.json dosyası:

{
  "Kestrel": {
    "Limits": {
      "MaxConcurrentConnections": 100,
      "MaxConcurrentUpgradedConnections": 100
    }
  }
}

Aşağıdaki yaklaşımlardan birini kullanın:

  • içinde Kestrel Startup.ConfigureServices yapılandırma:

    1. sınıfına bir IConfiguration örneği Startup ekleme. Aşağıdaki örnekte, özelliğine yeni yapılandırmanın atandığı Configuration varsayıldı.

    2. içinde, Startup.ConfigureServices yapılandırma Kestrel bö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:

    Program.cs içinde, yapılandırma Kestrel bölümünü Kestrel 'nin yapılandırmasına yükleme:

    // using Microsoft.Extensions.DependencyInjection;
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureServices((context, services) =>
            {
                services.Configure<KestrelServerOptions>(
                    context.Configuration.GetSection("Kestrel"));
            })
            .UseStartup<Startup>();
    

Yukarıdaki yaklaşımların her ikisi de herhangi bir yapılandırma sağlayıcısı ile çalışır.

Canlı tutma zaman aşımı

KeepAliveTimeout

Keep-alive zaman aşımını alır veya ayarlar. Varsayılan değer 2 dakikadır.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
        });

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:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Limits.MaxConcurrentConnections = 100;
        });

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.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
        });

En fazla bağlantı sayısı varsayılan olarak sınırsızdır (null).

En büyük istek gövdesi boyutu

MaxRequestBodySize

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()

Her istekte uygulama kısıtlamasını yapılandırmayı gösteren bir örnek:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
        });

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 olduğunu belirten bir özellik IsReadOnly vardır. Bu, sınırın yapılandırılması için çok MaxRequestBodySize geç olduğu anlamına gelir.

Bir uygulama, ASP.NET Core Modülü'ASP.NET Core işlem dışı bırakılmıştır çünküIIS zaten sınırı Kestrel 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, istemciye gönderme oranını en düşük değere kadar artırmasını veren süredir; bu süre Kestrel boyunca hız 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 saniye yetkisiz kullanım süresiyle 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.

Program.cs'de en düşük veri oranlarının nasıl yapılandırıldığından emin olmak için aşağıdaki örneği kullanın:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Limits.MinRequestBodyDataRate =
                new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
            serverOptions.Limits.MinResponseDataRate =
                new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
        });

İstek üst bilgileri zaman aşımı

RequestHeadersTimeout

Sunucunun istek üst bilgilerini almak için harcadığı maksimum zamanı alır veya ayarlar. Varsayılan olarak 30 saniyedir.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
        });

Zaman Uyumlu G/Ç

AllowSynchronousIO , istek ve yanıt için zaman uyumlu I/O'ya izin verili olup olmadığını kontrol eder. Varsayılan değer: true .

Uyarı

Çok sayıda engelleme zaman uyumlu I/O işlemleri, iş parçacığı havuzu açlıklarına neden olabilir ve bu da uygulamanın yanıt vermemeye neden olur. Yalnızca AllowSynchronousIO zaman uyumsuz I/O'yi desteklemez bir kitaplık kullanırken etkinleştirin.

Aşağıdaki örnek zaman uyumlu I/O'yi devre dışı bırakıyor:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.AllowSynchronousIO = false;
        });

Diğer seçenekler ve sınırlar Kestrel hakkında bilgi için bkz:

Uç nokta yapılandırması

Varsayılan olarak, ASP.NET Core şu bağlantılara bağlanıyor:

  • http://localhost:5000
  • https://localhost:5001 (yerel bir geliştirme sertifikası mevcut olduğunda)

Şu url'leri kullanarak URL'leri belirtin:

  • ASPNETCORE_URLS ortam değişkeni.
  • --urls komut satırı bağımsız değişkeni.
  • urls konak yapılandırma anahtarı.
  • UseUrls extension yöntemi.

Bu yaklaşımlar kullanılarak sağlanan değer bir veya daha fazla HTTP ve HTTPS uç noktası (varsayılan sertifika varsa HTTPS) olabilir. Değeri noktalı virgülle ayrılmış liste (örneğin, ) olarak "Urls": "http://localhost:8000;http://localhost:8001" yapılandırma.

Bu yaklaşımlar hakkında daha fazla bilgi için bkz. Sunucu URL'leri ve Geçersiz Kılma yapılandırması.

Bir geliştirme sertifikası oluşturulur:

Bazı tarayıcıların yerel geliştirme sertifikasına güvenmesi için açık izin verilmesi gerekir.

Project şablonları, uygulamaları varsayılan olarak HTTPS üzerinde çalıştıracak şekilde yapılandırarak HTTPS yeniden yönlendirme ve HSTS desteği içerir.

url Listen ön ListenUnixSocket eklerini ve bağlantı noktalarını yapılandırmak için çağrısı KestrelServerOptions veya Kestrel yöntemleri.

UseUrls, komut satırı bağımsız değişkeni, konak yapılandırma anahtarı ve ortam değişkeni de çalışır, ancak bu bölümün ilerleyen kısımlarında (HTTPS uç noktası yapılandırması için varsayılan sertifikanın kullanılabilir olması --urls urls ASPNETCORE_URLS gerekir) sınırlamalara sahiptir.

KestrelServerOptions Yapılandırma:

ConfigureEndpointDefaults(Eylem <ListenOptions> )

Belirtilen her uç nokta Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureEndpointDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ConfigureEndpointDefaults(listenOptions =>
            {
                // Configure endpoint defaults
            });
        });

Not

Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureEndpointDefaults uç noktaların varsayılan değerleri uygulanmaz.

ConfigureHttpsDefaults(Eylem <HttpsConnectionAdapterOptions> )

Her HTTPS uç noktası Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureHttpsDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureKestrel((context, serverOptions) =>
        {
            serverOptions.ConfigureHttpsDefaults(listenOptions =>
            {
                // certificate is an X509Certificate2
                listenOptions.ServerCertificate = certificate;
            });
        });

Not

Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureHttpsDefaults uç noktaların varsayılan değerleri uygulanmaz.

Configure(IConfiguration)

Giriş olarak alan bir ayar için Kestrel bir yapılandırma IConfiguration yükleyicisi oluşturur. Yapılandırmanın kapsamı için yapılandırma bölümü olarak Kestrel genişletildi.

ListenOptions.UseHttps

KestrelHTTPS kullanmak için yapılandırma.

ListenOptions.UseHttps Uzantı -ları:

  • UseHttps: Varsayılan Kestrel sertifika ile HTTPS kullanmak üzere yapılandırma. Varsayılan sertifika yapılandırılmamışsa bir özel durum oluşturur.
  • UseHttps(string fileName)
  • UseHttps(string fileName, string password)
  • UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(StoreName storeName, string subject)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)
  • UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(X509Certificate2 serverCertificate)
  • UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)
  • UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)

ListenOptions.UseHttps Parametre:

  • filename , uygulamanın içerik dosyalarını içeren dizine göre bir sertifika dosyasının yolu ve dosya adıdır.
  • password , X.509 sertifika verilerine erişmek için gereken paroladır.
  • configureOptions, yapılandırmak Action için bir 'dır. HttpsConnectionAdapterOptions döndürür. ListenOptions
  • storeName , sertifikanın yükln olduğu sertifika deposu.
  • subject , sertifikanın konu adıdır.
  • allowInvalid , otomatik olarak imzalanan sertifikalar gibi geçersiz sertifikaların dikkate alınmalıdır.
  • location , sertifikanın yükln olduğu depo konumu.
  • serverCertificate X.509 sertifikasıdır.

Üretimde HTTPS'nin açıkça yapılandırılması gerekir. En azından, varsayılan bir sertifika sağlanmalıdır.

Bundan sonra açıklanan desteklenen yapılandırmalar:

  • Yapılandırma yok
  • Yapılandırmadan varsayılan sertifikayı değiştirme
  • Kodda varsayılanları değiştirme

Yapılandırma yok

Kestrel ve http://localhost:5000 (varsayılan https://localhost:5001 bir sertifika varsa) dinler.

Yapılandırmadan varsayılan sertifikayı değiştirme

CreateDefaultBuilder varsayılan Configure(context.Configuration.GetSection("Kestrel")) olarak yük yapılandırmasına Kestrel çağrır. için varsayılan bir HTTPS uygulama ayarları yapılandırma şeması Kestrel mevcuttur. Disk veya sertifika depolama alanı üzerinde bulunan bir dosyadan, URL'ler ve kullanmak üzere sertifikalar dahil olmak üzere birden çok uç nokta yapılandırma.

Aşağıdaki appsettings.json örnekte:

  • AllowInvalid'i geçersiz sertifikaların (örneğin, otomatik olarak imzalanan sertifikalar) kullanımına true izin verecek şekilde ayarlayın.
  • Sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte HttpsDefaultCert), Sertifikalar Varsayılan veya geliştirme sertifikası altında tanımlanan sertifikaya > geri döner.
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://localhost:5000"
      },

      "HttpsInlineCertFile": {
        "Url": "https://localhost:5001",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      },

      "HttpsInlineCertStore": {
        "Url": "https://localhost:5002",
        "Certificate": {
          "Subject": "<subject; required>",
          "Store": "<certificate store; required>",
          "Location": "<location; defaults to CurrentUser>",
          "AllowInvalid": "<true or false; defaults to false>"
        }
      },

      "HttpsDefaultCert": {
        "Url": "https://localhost:5003"
      },

      "Https": {
        "Url": "https://*:5004",
        "Certificate": {
          "Path": "<path to .pfx file>",
          "Password": "<certificate password>"
        }
      }
    },
    "Certificates": {
      "Default": {
        "Path": "<path to .pfx file>",
        "Password": "<certificate password>"
      }
    }
  }
}

Herhangi bir sertifika düğümü için Yol ve Parola kullanmanın alternatifi, sertifika depolama alanlarını kullanarak sertifikayı belirtmektir. Örneğin, Sertifikalar > Varsayılan sertifikası şu şekilde belirtilebilir:

"Default": {
  "Subject": "<subject; required>",
  "Store": "<cert store; required>",
  "Location": "<location; defaults to CurrentUser>",
  "AllowInvalid": "<true or false; defaults to false>"
}

Şema notları:

  • Uç nokta adları büyük/büyük/büyük harfe duyarlı değildir. Örneğin, HTTPS ve Https geçerlidir.
  • parametresi Url her uç nokta için gereklidir. Bu parametrenin biçimi, tek bir değerle sınırlı olması dışında üst Urls düzey yapılandırma parametresiyle aynıdır.
  • Bu uç noktalar, bunlara eklemek yerine üst düzey Urls yapılandırmada tanımlananların yerini almaktadır. aracılığıyla kodda tanımlanan uç Listen noktalar, yapılandırma bölümünde tanımlanan uç noktalarla biriktir.
  • bölümü Certificate isteğe bağlıdır. Bölümü Certificate belirtilmezse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Varsayılan değer yoksa sunucu bir özel durum oluşturur ve başlatamaz.
  • bölümü Certificate hem Yol Parolası hemde Konu Deposusertifikalarını destekler.
  • Bağlantı noktası çakışmaları neden olmayacak şekilde herhangi bir sayıda uç nokta bu şekilde tanımlanabilir.
  • options.Configure(context.Configuration.GetSection("{SECTION}")) , KestrelConfigurationLoader yapılandırılan .Endpoint(string name, listenOptions => { }) uç noktanın ayarlarını tamamlarken kullanılan bir yöntemi ile döndürür:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel((context, serverOptions) =>
        {
            serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
                .Endpoint("HTTPS", listenOptions =>
                {
                    listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
                });
        });

KestrelServerOptions.ConfigurationLoader tarafından sağlanan yükleyici gibi mevcut yükleyicide tekrar çalışmaya devam etmek için doğrudan CreateDefaultBuilder erişilebilir.

  • Her uç noktanın yapılandırma bölümü, özel ayarların Endpoint okunmalarını için yönteminde bulunan seçeneklerde kullanılabilir.
  • Başka bir bölümle yeniden çağrılarak options.Configure(context.Configuration.GetSection("{SECTION}")) birden çok yapılandırma yüklenebilir. Önceki örneklerde açıkça Load çağrılmadıkça yalnızca son yapılandırma kullanılır. Meta paket, varsayılan yapılandırma Load bölümünün değiştirilene kadar çağrısız.
  • KestrelConfigurationLoader , API ailesini aşırı yüklemeler olarak yansıtarak kod ve yapılandırma uç Listen KestrelServerOptions Endpoint noktalarının aynı yerde yapılandırılamalarını sağlar. Bu aşırı yüklemeler adları kullanmaz ve yalnızca yapılandırmadan varsayılan ayarları kullanır.

Kodda varsayılanları değiştirme

ConfigureEndpointDefaults ve , önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma da dahil olmak üzere ve ConfigureHttpsDefaults için varsayılan ayarları değiştirmek için ListenOptions HttpsConnectionAdapterOptions kullanılabilir. ConfigureEndpointDefaults ve ConfigureHttpsDefaults herhangi bir uç nokta yapılandırılmadan önce çağrılmış olmalıdır.

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel((context, serverOptions) =>
        {
            serverOptions.ConfigureEndpointDefaults(listenOptions =>
            {
                // Configure endpoint defaults
            });

            serverOptions.ConfigureHttpsDefaults(listenOptions =>
            {
                listenOptions.SslProtocols = SslProtocols.Tls12;
            });
        });

Kestrel SNI desteği

Sunucu Adı Belirtme (SNI), aynı IP adresi ve bağlantı noktası üzerinde birden çok etki alanı barındırmak için kullanılabilir. SNI'nin çalışması için istemci, güvenli oturum için ana bilgisayar adını TLS el sıkışması sırasında sunucuya gönderir, böylece sunucu doğru sertifikayı sağlar. İstemci, TLS el sıkışmasını izleyen güvenli oturum sırasında sunucuyla şifreli iletişim için sertifikayı kullanır.

Kestrel geri çağırma aracılığıyla ServerCertificateSelector SNI'yi destekler. Uygulamanın konak adını incelemesine ve uygun sertifikayı seçmesine izin vermek için bağlantı başına bir kez geri çağırma çağrılır.

SNI desteği şunları gerektirir:

  • Hedef çerçevede veya netcoreapp2.1 daha sonraki bir üzerinde çalışıyor. veya net461 sonraki bir zamanda, geri çağırma çağrılır ancak her zaman name null olur. nameayrıca istemci TLS el sıkışması içinde ana bilgisayar adı null parametresini sağlamazsa da olur.
  • Tüm web siteleri aynı örnekte Kestrel çalıştır. Kestrel bir IP adresinin ve bağlantı noktasının ters ara sunucu olmadan birden çok örnek arasında paylaşımını desteklemez.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel((context, serverOptions) =>
        {
            serverOptions.ListenAnyIP(5005, listenOptions =>
            {
                listenOptions.UseHttps(httpsOptions =>
                {
                    var localhostCert = CertificateLoader.LoadFromStoreCert(
                        "localhost", "My", StoreLocation.CurrentUser,
                        allowInvalid: true);
                    var exampleCert = CertificateLoader.LoadFromStoreCert(
                        "example.com", "My", StoreLocation.CurrentUser,
                        allowInvalid: true);
                    var subExampleCert = CertificateLoader.LoadFromStoreCert(
                        "sub.example.com", "My", StoreLocation.CurrentUser,
                        allowInvalid: true);
                    var certs = new Dictionary<string, X509Certificate2>(
                        StringComparer.OrdinalIgnoreCase);
                    certs["localhost"] = localhostCert;
                    certs["example.com"] = exampleCert;
                    certs["sub.example.com"] = subExampleCert;

                    httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
                    {
                        if (name != null && certs.TryGetValue(name, out var cert))
                        {
                            return cert;
                        }

                        return exampleCert;
                    };
                });
            });
        })
        .Build();

Bağlantı günlüğü

Bağlantıda UseConnectionLogging bayt düzeyinde iletişim için Hata Ayıklama düzeyi günlüklerini yayın. Bağlantı günlüğü, TLS şifrelemesi sırasında ve aracıların arkasında olduğu gibi alt düzey iletişim sorunlarını gidermeye yardımcı olur. ' UseConnectionLogging den önce UseHttps yerleştirilirse, şifrelenmiş trafik günlüğe kaydedilir. 'den UseConnectionLogging sonra UseHttps yerleştirilirse şifresi çözülen trafik günlüğe kaydedilir.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
    {
        listenOptions.UseConnectionLogging();
    });
});

TCP yuvasına bağlama

yöntemi Listen bir TCP yuvasına bağlar ve lambda seçenekleri X.509 sertifika yapılandırmasına izin sağlar:

public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Listen(IPAddress.Loopback, 5000);
            serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
            {
                listenOptions.UseHttps("testCert.pfx", "testPassword");
            });
        });
public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.Listen(IPAddress.Loopback, 5000);
            serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
            {
                listenOptions.UseHttps("testCert.pfx", "testPassword");
            });
        });

Örnek, ile bir uç nokta için HTTPS'yi ListenOptions yapılandırmaktadır. Belirli uç noktaların diğer ayarlarını yapılandırmak Kestrel için aynı API'yi kullanın.

Windows 'da, otomatik olarak imzalanan sertifikalar New-SelfSignedCertificate PowerShell cmdlet 'ikullanılarak oluşturulabilir. Desteklenmeyen bir örnek için bkz. UpdateIISExpressSSLForChrome.ps1.

MacOS, Linux ve Windows 'da, Sertifikalar OpenSSLkullanılarak oluşturulabilir.

Unix yuvasına bağlama

Bu örnekte gösterildiği gibi Nginx ile daha iyi performans için ile bir Unix ListenUnixSocket yuvasında dinleme:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(serverOptions =>
        {
            serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
            serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock", listenOptions =>
            {
                listenOptions.UseHttps("testCert.pfx", "testpassword");
            });
        });
  • Nginxuguuguration dosyasında girdisini server > location > proxy_pass olarak http://unix:/tmp/{KESTREL SOCKET}:/; ayarlayın. {KESTREL SOCKET} , için sağlanan yuvanın ListenUnixSocket adıdır (örneğin, kestrel-test.sock önceki örnekte).
  • Yuvanın Nginx tarafından yazılabilir olduğundan emin olun (örneğin, chmod go+w /tmp/kestrel-test.sock ).

Bağlantı noktası 0

Bağlantı noktası numarası 0 belirtilirse, Kestrel kullanılabilir bir bağlantı noktasına dinamik olarak bağlar. Aşağıdaki örnek, çalışma zamanında gerçekten bağlı olan bağlantı Kestrel noktasının nasıl belirleneceklerini gösterir:

public void Configure(IApplicationBuilder app)
{
    var serverAddressesFeature = 
        app.ServerFeatures.Get<IServerAddressesFeature>();

    app.UseStaticFiles();

    app.Run(async (context) =>
    {
        context.Response.ContentType = "text/html";
        await context.Response
            .WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
                "<title></title></head><body><p>Hosted by Kestrel</p>");

        if (serverAddressesFeature != null)
        {
            await context.Response
                .WriteAsync("<p>Listening on the following addresses: " +
                    string.Join(", ", serverAddressesFeature.Addresses) +
                    "</p>");
        }

        await context.Response.WriteAsync("<p>Request URL: " +
            $"{context.Request.GetDisplayUrl()}<p>");
    });
}

Uygulama çalıştırıldı mı, konsol penceresi çıkışı uygulamaya ulaşılanın dinamik bağlantı noktasını gösterir:

Listening on the following addresses: http://127.0.0.1:48508

Sınırlamalar

Uç noktaları aşağıdaki yaklaşımlarla yapılandırma:

  • UseUrls
  • --urls komut satırı bağımsız değişkeni
  • urls konak yapılandırma anahtarı
  • ASPNETCORE_URLS ortam değişkeni

Bu yöntemler, kodun dışında sunucularla çalışması için Kestrel yararlıdır. Ancak, aşağıdaki sınırlamalara dikkat edin:

  • HTTPS uç noktası yapılandırmasında varsayılan bir sertifika sağlanıyorsa (örneğin, bu konuda daha önce gösterildiği gibi yapılandırma veya yapılandırma dosyası kullanarak) HTTPS bu yaklaşımlarla KestrelServerOptions kullanılamaz.
  • Hem hem de Listen UseUrls yaklaşımları aynı anda kullanılırsa, uç Listen noktalar uç noktaları geçersiz UseUrls kılar.

IIS uç nokta yapılandırması

IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya tarafından Listen UseUrls ayarlanır. Daha fazla bilgi için ASP.NET Core Modülü konu başlığına bakın.

Libuv aktarım yapılandırması

ASP.NET Core 2.1'in sürümüyle, 'nin varsayılan taşıması artık Libuv'a değil, yönetilen Kestrel yuvalara dayalıdır. Bu, 2.0 ASP.NET Core çağıran ve aşağıdaki paketlerden herhangi birini temel alan 2.1 sürümüne yükselten uygulamalar için UseLibuv yeni bir değişikliktir:

Libuv kullanımını gerektiren projeler için:

URL ön ekleri

, UseUrls komut --urls satırı bağımsız değişkeni, konak yapılandırma anahtarı veya ortam değişkeni kullanılırken, URL ön urls ASPNETCORE_URLS ekleri aşağıdaki biçimlerden herhangi biri olabilir.

Yalnızca HTTP URL ön ekleri geçerlidir. Kestrel kullanarak URL bağlamalarını yapılandırarak HTTPS'yi UseUrls desteklemez.

  • Bağlantı noktası numarasına sahip IPv4 adresi

    http://65.55.39.10:80/
    

    0.0.0.0 , tüm IPv4 adreslerine bağlanan özel bir durum değildir.

  • Bağlantı noktası numarasına sahip IPv6 adresi

    http://[0:0:0:0:0:ffff:4137:270a]:80/
    

    [::], IPv4'e eşdeğer olan IPv6'dır. 0.0.0.0

  • Bağlantı noktası numarası ile ana bilgisayar adı

    http://contoso.com:80/
    http://*:80/
    

    Konak adları * , ve özel + değil. Geçerli bir IP adresi olarak tanınmaz veya tüm localhost IPv4 ve IPv6 IP'lere bağlanabilir. Aynı bağlantı noktası üzerinde farklı konak ASP.NET Core uygulamalarına bağlamak için IIS, Nginx veya Apache HTTP.sys bir ters ara sunucu kullanın.

    Uyarı

    Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.

  • Bağlantı localhost noktası numarasına veya bağlantı noktası numarasına sahip geri döngü IP'sini olan ana bilgisayar adı

    http://localhost:5000/
    http://127.0.0.1:5000/
    http://[::1]:5000/
    

    localhostBelirtilirse, Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerini bağlamaya çalışır. İstenen bağlantı noktası herhangi bir geri döngü arabiriminde başka bir hizmet tarafından kullanıyorsa Kestrel başlatamaz. Herhangi bir geri döngü arabirimi başka bir nedenle kullanılamıyorsa (genellikle IPv6 desteklenmediği için), Kestrel bir uyarı kaydeder.

Konak filtreleme

Kestrel, Gibi önekleri temel alarak yapılandırmayı desteklerken http://example.com:5000 , büyük Kestrel ölçüde ana bilgisayar adını yoksayar. Ana bilgisayar localhost , geri döngü adreslerine bağlama için kullanılan özel bir durumdur. Açık IP adresi dışındaki tüm ana bilgisayar tüm genel IP adreslerine bağlanır. Host Üstbilgiler doğrulanmadı.

Geçici bir çözüm olarak, ana bilgisayar filtreleme ara yazılımı kullanın. ana bilgisayar filtreleme ara yazılımı, Microsoft.AspNetCore.App metapackage (ASP.NET Core 2,1 veya 2,2) içinde yer alan Microsoft. aspnetcore. hostfiltering paketi tarafından sağlanır. Ara yazılım tarafından eklenir CreateDefaultBuilder ve şunları çağırır AddHostFiltering :

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Ana bilgisayar filtreleme ara yazılımı varsayılan olarak devre dışıdır. Ara yazılımı etkinleştirmek için AllowedHosts appSettings 'de bir anahtar tanımlayın appsettings.json / . <EnvironmentName> . JSON. Değer, bağlantı noktası numaraları olmayan ana bilgisayar adlarının noktalı virgülle ayrılmış listesidir:

appsettings.json:

{
  "AllowedHosts": "example.com;localhost"
}

Not

Iletilen üstbilgiler ara yazılımı da bir AllowedHosts seçenek içerir. İletilen üstbilgiler ara yazılımı ve ana bilgisayar filtreleme ara yazılımı, farklı senaryolar için benzer işlevlere sahiptir. AllowedHostsIletilen üstbilgiler ara yazılımı ile, Host istekler ters bir ara sunucu veya yük dengeleyici ile iletilirken üst bilgi korunurken, bu işlem için uygun bir ayar vardır. AllowedHostsAna bilgisayar filtreleme ara yazılımı ile ayarlandığında, Kestrel genel kullanıma yönelik bir uç sunucu olarak veya Host üst bilgi doğrudan iletildiğinde kullanılır.

Iletilen üstbilgiler ara yazılımı hakkında daha fazla bilgi için bkz Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma ..

HTTP/1.1 istek boşaltma

HTTP bağlantılarının açılması zaman alabilir. HTTPS için de kaynak kullanımı yoğun bir işlemdir. Bu nedenle, Kestrel http/1.1 protokolü başına bağlantıları yeniden kullanmaya çalışır. Bağlantının yeniden kullanılmasına izin vermek için bir istek gövdesi tam olarak tüketilmelidir. Uygulama, POST sunucunun yeniden yönlendirme veya 404 yanıtı döndürdüğü bir istek gibi her zaman istek gövdesini tüketmez. POSTYeniden yönlendirme durumunda:

  • İstemci, verilerin bir bölümünü zaten göndermiş olabilir POST .
  • Sunucu 301 yanıtını yazar.
  • POSTÖnceki istek gövdesinden gelen veriler tam olarak okunana kadar bağlantı yeni bir istek için kullanılamaz.
  • Kestrel istek gövdesini boşaltmaya çalışır. İstek gövdesini boşaltma işlemi işlemeden verileri okuma ve atma anlamına gelir.

Boşaltma işlemi bağlantının yeniden kullanılmasına izin verme ve kalan verilerin boşaltıma süresi arasında bir ilerleme gerçekleştirir:

  • Boşaltma, yapılandırılabilir olmayan beş saniyelik bir zaman aşımına sahip olur.
  • Veya üstbilgisi tarafından belirtilen tüm veriler Content-Length Transfer-Encoding zaman aşımından önce okunmadıysa bağlantı kapatılır.

Bazen, yanıtı yazmadan önce veya sonra isteği hemen sonlandırmak isteyebilirsiniz. Örneğin, istemciler sınırlı verilerin büyük bir düzeyi olabilir, bu nedenle karşıya yüklenen verileri sınırlamak bir öncelik olabilir. Bu tür durumlarda bir isteği sonlandırmak için bir denetleyici, sayfa veya ara yazılım aracılığıyla HttpContext. Abort ' ı çağırın Razor .

Çağırmanın uyarıları vardır Abort :

  • Yeni bağlantı oluşturma yavaş ve pahalı olabilir.
  • İstemcinin bağlantı kapanmadan önce yanıtı okuduğunuzdan emin olmaz.
  • Çağırma Abort , yaygın hatalara değil önemli hata durumları için nadir ve ayrılmış olmalıdır.
    • Yalnızca Abort belirli bir sorunun çözülmesi gerektiğinde çağırın. Örneğin, Abort kötü amaçlı istemciler veri almaya çalışıyorsa POST veya istemci kodunda büyük veya çok sayıda isteğe neden olan bir hata olduğunda çağırın.
    • AbortHTTP 404 (bulunamadı) gibi yaygın hata durumları için çağrı yapmayın.

Çağrılmadan önce HttpResponse. tamamlana eşitlemesini çağırmak Abort Sunucunun yanıtı yazmayı tamamlamasını sağlar. Ancak, istemci davranışı tahmin edilebilir değildir ve bağlantı durdurulmadan önce yanıtı okuyamayabilir.

Bu işlem HTTP/2 için farklıdır çünkü protokol, bağlantıyı kapatmadan bağımsız istek akışlarını iptal etme işlemini destekler. Beş saniyelik boşaltma zaman aşımı uygulanmaz. Yanıt tamamlandıktan sonra herhangi bir okunmamış istek gövdesi verisi varsa, sunucu bir HTTP/2 RST çerçevesi gönderir. Ek istek gövdesi veri çerçeveleri yok sayılır.

Mümkünse, istemcilerin Beklenen: 100-Continue istek üst bilgisini kullanabilmesi ve istek gövdesini göndermeden önce sunucunun yanıt vermesini beklemek daha iyidir. Bu, istemciye gereksiz verileri göndermeden önce yanıtı İnceleme ve iptal etme olanağı sunar.

Ek kaynaklar