Kestrel ASP.NET Core'da web sunucusu

Tom Dykstra, Chris Ross ve Stephen Halter tarafından

KestrelASP.NET Core için platformlar arası bir web sunucusudur. Kestrel ASP.NET Core için önerilen sunucudur ve ASP.NET Core proje şablonlarında varsayılan olarak yapılandırılır.

Kestrel'nin özellikleri şunlardır:

  • Platformlar arası:Kestrel Windows, Linux ve macOS üzerinde çalışan platformlar arası bir web sunucusudur.
  • Yüksek performans:Kestrel çok sayıda eşzamanlı bağlantıyı verimli bir şekilde işlemek için iyileştirilmiştir.
  • Basit: Kapsayıcılar ve uç cihazlar gibi kaynak kısıtlanmış ortamlarda çalışmak için iyileştirilmiştir.
  • Güvenlik sağlamlaştırılmış:Kestrel HTTPS'i destekler ve web sunucusu güvenlik açıklarına karşı güçlendirilir.
  • Geniş protokol desteği:Kestrel Aşağıdakiler dahil olmak üzere yaygın web protokollerini destekler:
  • ASP.NET Core ile tümleştirme: Ara yazılım işlem hattı, bağımlılık ekleme ve yapılandırma sistemi gibi diğer ASP.NET Core bileşenleriyle sorunsuz tümleştirme.
  • Esnek iş yükleri: Kestrel birçok iş yükünü destekler:
    • Minimal API'ler, MVC Razor , sayfalar SignalR, , Blazorve gRPC gibi uygulama çerçevelerini ASP.NET.
    • YARP ile ters proxy oluşturma.
  • Genişletilebilirlik: Yapılandırma, ara yazılım ve özel aktarımlar aracılığıyla özelleştirin Kestrel .
  • Performans tanılama:Kestrel Günlüğe kaydetme ve ölçümler gibi yerleşik performans tanılama özellikleri sağlar.

Başlarken

ASP.NET Çekirdek proje şablonları, IIS ile barındırılmadığında varsayılan olarak kullanır Kestrel . Aşağıdaki şablon tarafından oluşturulan Program.csWebApplication.CreateBuilder içinde yöntemi dahili olarak çağırırUseKestrel:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

ve yapılandırma WebApplication hakkında daha fazla bilgi için bkz. En az API hızlı başvurusu.WebApplicationBuilder

İsteğe bağlı istemci sertifikaları

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

Hata ayıklayıcı eklenmiş davranış

Hata ayıklayıcı bir işleme eklendiğinde Kestrel aşağıdaki zaman aşımları ve hız sınırları uygulanmaz:

Ek kaynaklar

Dekont

ASP.NET Core 5.0 itibarıyla libuv Kestreltaşıması kullanım dışıdır. Libuv aktarım, Windows ARM64 gibi yeni işletim sistemi platformlarını destekleyecek güncelleştirmeleri almaz ve gelecek bir sürümde kaldırılacaktır. Kullanılmayan UseLibuv yönteme yapılan çağrıları kaldırın ve bunun yerine 'nin varsayılan Yuva aktarımını kullanın Kestrel.

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

Kestrel aşağıdaki senaryoları destekler:

†HTTP/2, gelecekteki bir sürümde macOS'ta desteklenecektir.

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

Başlarken

ASP.NET Çekirdek proje şablonları, IIS ile barındırılmadığında varsayılan olarak kullanır Kestrel . Aşağıdaki şablon tarafından oluşturulan Program.csWebApplication.CreateBuilder içinde yöntemi dahili olarak çağırırUseKestrel:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

ve yapılandırma WebApplication hakkında daha fazla bilgi için bkz. En az API hızlı başvurusu.WebApplicationBuilder

İsteğe bağlı istemci sertifikaları

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

Hata ayıklayıcı eklenmiş davranış

Hata ayıklayıcı bir işleme eklendiğinde Kestrel aşağıdaki zaman aşımları ve hız sınırları uygulanmaz:

Ek kaynaklar

Dekont

ASP.NET Core 5.0 itibarıyla libuv Kestreltaşıması kullanım dışıdır. Libuv aktarım, Windows ARM64 gibi yeni işletim sistemi platformlarını destekleyecek güncelleştirmeleri almaz ve gelecek bir sürümde kaldırılacaktır. Kullanılmayan UseLibuv yönteme yapılan çağrıları kaldırın ve bunun yerine 'nin varsayılan Yuva aktarımını kullanın Kestrel.

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

Kestrel aşağıdaki senaryoları destekler:

†HTTP/2, gelecekteki bir sürümde 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 (indirme)

Başlarken

ASP.NET Çekirdek proje şablonları, IIS ile barındırılmadığında varsayılan olarak kullanır Kestrel . içinde Program.csyöntemi şunu ConfigureWebHostDefaults çağırır UseKestrel:

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

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

Konağı oluşturma hakkında daha fazla bilgi için ASP.NET Core'da .NET Genel Konağı'nın Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine bakın.

İsteğe bağlı istemci sertifikaları

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

Ek kaynaklar

Dekont

ASP.NET Core 5.0 itibarıyla libuv Kestreltaşıması kullanım dışıdır. Libuv aktarım, Windows ARM64 gibi yeni işletim sistemi platformlarını destekleyecek güncelleştirmeleri almaz ve gelecek bir sürümde kaldırılacaktır. Kullanılmayan UseLibuv yönteme yapılan çağrıları kaldırın ve bunun yerine 'nin varsayılan Yuva aktarımını kullanın Kestrel.

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

Kestrel aşağıdaki senaryoları destekler:

†HTTP/2, gelecekteki bir sürümde 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 (indirme)

HTTP/2 desteği

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

  • İşletim sistemi†
    • Windows Server 2016/Windows 10 veya üzeri‡
    • OpenSSL 1.0.2 veya üzeri yüklü Linux (örneğin, Ubuntu 16.04 veya üzeri)
  • Hedef çerçeve: .NET Core 2.2 veya üzeri
  • Uygulama Katmanı Protokolü Anlaşması (ALPN) bağlantısı
  • TLS 1.2 veya üzeri bağlantısı

†HTTP/2, gelecekteki bir sürümde macOS'ta desteklenecektir. Kestrel‡ Windows Server 2012 R2 ve Windows 8.1'de HTTP/2 desteği sınırlıdır. 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.

HTTP/2 bağlantısı kuruluysa, HttpRequest.Protocol bildirir HTTP/2.

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

Ters ara sunucu ile ne zaman kullanılır Kestrel ?

Kestrel kendi başına veya ters ara sunucu ile kullanılabilir. Ters ara sunucu ağdan HTTP istekleri alır ve bunları adresine Kestreliletir. Ters ara sunucu örnekleri şunlardır:

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

Kestrel communicates directly with the Internet without a reverse proxy server

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

Kestrel communicates indirectly with the Internet through a reverse proxy server, such as IIS, Nginx, or Apache

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ıldığında, aynı IP ve bağlantı noktasının birden çok işlem arasında paylaşılması desteklenmez. Bir bağlantı noktasında dinleyecek şekilde yapılandırıldığında Kestrel , Kestrel isteklerin Host üst bilgilerinden bağımsız olarak bu bağlantı noktası için tüm trafiği işler. Bağlantı noktalarını paylaşabilen ters ara sunucu, istekleri benzersiz bir IP'ye Kestrel ve bağlantı noktasına iletebilir.

Ters ara sunucu gerekli olmasa bile, ters ara sunucu kullanmak iyi bir seçim olabilir.

Ters ara sunucu:

  • Barındırdığını uygulamaların kullanıma sunulan 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ştirebilir.
  • Yük dengeleme 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 uygulamanın iç ağdaki sunucularıyla iletişim kurabilir.

Uyarı

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

Kestrel ASP.NET Core uygulamalarında

ASP.NET Core proje şablonları varsayılan olarak kullanır Kestrel . içinde Program.csyöntemi şunu ConfigureWebHostDefaults çağırır UseKestrel:

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

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

Konağı oluşturma hakkında daha fazla bilgi için ASP.NET Core'da .NET Genel Konağı'nın Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine bakın.

çağrısı ConfigureWebHostDefaultsyaptıktan sonra ek yapılandırma sağlamak için kullanın ConfigureKestrel:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(serverOptions =>
            {
                // Set properties and call methods on options
            })
            .UseStartup<Startup>();
        });

Kestrel Seçenekler

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

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

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

using Microsoft.AspNetCore.Server.Kestrel.Core;

Bu makalenin devamında gösterilen örneklerde, Kestrel seçenekler C# kodunda yapılandırılır. Kestrel seçenekleri bir yapılandırma sağlayıcısı kullanılarak da ayarlanabilir. Örneğin, Dosya Yapılandırma Sağlayıcısı bir appsettings.json veya appsettings.{Environment}.json dosyasından yapılandırma yükleyebilirKestrel:

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

Dekont

KestrelServerOptions ve uç nokta yapılandırması, yapılandırma sağlayıcılarından yapılandırılabilir. Kalan Kestrel yapılandırma C# kodunda yapılandırılmalıdır.

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

  • içinde Startup.ConfigureServicesyapılandırınKestrel:

    1. sınıfına öğesinin bir örneğini IConfigurationStartup ekleme. Aşağıdaki örnekte eklenen yapılandırmanın özelliğine Configuration atandığı varsayılır.

    2. içinde Startup.ConfigureServices, yapılandırmanın Kestrel bölümünü 'nin yapılandırmasına Kestrelyükleyin:

      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)
          {
              ...
          }
      }
      
  • Konağı oluştururken yapılandırma Kestrel :

    içinde Program.cs, yapılandırmanın Kestrel bölümünü 'nin yapılandırmasına Kestrelyükleyin:

    // 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ıyla çalışır.

Etkin tutma zaman aşımı

KeepAliveTimeout

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

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

En fazla istemci bağlantısı

MaxConcurrentConnections MaxConcurrentUpgradedConnections

Uygulamanın tamamı için en fazla eşzamanlı açık TCP bağlantısı sayısı aşağıdaki kodla ayarlanabilir:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

HTTP veya HTTPS'den başka bir protokole yükseltilen bağlantılar için ayrı bir sınır vardır (örneğin, bir WebSockets isteğinde). Bağlantı yükseltildikten sonra sınıra MaxConcurrentConnections göre sayılmaz.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

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

Maksimum istek gövdesi boyutu

MaxRequestBodySize

Varsayılan maksimum istek gövdesi boyutu 30.000.000 bayttır ve bu da yaklaşık 28,6 MB'tır.

ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yaklaşım, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Her istekte uygulama kısıtlamasının nasıl yapılandırıldığını gösteren bir örnek aşağıda verilmişti:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

Ara yazılımda belirli bir istekte ayarı geçersiz kılın:

app.Run(async (context) =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>()
        .MaxRequestBodySize = 10 * 1024;

    var minRequestRateFeature = 
        context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
    var minResponseRateFeature = 
        context.Features.Get<IHttpMinResponseDataRateFeature>();

    if (minRequestRateFeature != null)
    {
        minRequestRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    if (minResponseRateFeature != null)
    {
        minResponseRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

Uygulama isteği okumaya başladıktan sonra istekte sınırı yapılandırırsa bir özel durum oluşur. Özelliğin salt okunur durumda olup olmadığını MaxRequestBodySize belirten bir IsReadOnly özellik vardır; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.

bir uygulama ASP.NET Çekirdek Modülü arkasında işlem dışı kaldığında, KestrelIIS sınırı zaten ayarladığı için istek gövdesi boyutu sınırı devre dışı bırakılır.

En düşük istek gövdesi veri hızı

MinRequestBodyDataRate MinResponseDataRate

Kestrel veriler belirtilen hızda bayt/saniye cinsinden geliyorsa her saniyeyi denetler. Hız minimum değerin altına düşerse bağlantı zaman aşımına uğradı. Yetkisiz kullanım süresi, istemcinin gönderme oranını en düşük değere kadar artırmasını sağlayan süredir Kestrel ; bu süre boyunca oran denetlenmiyor. Yetkisiz kullanım süresi, TCP yavaş başlatması nedeniyle başlangıçta yavaş hızda veri gönderen bağlantıların bırakılmasını önlemeye yardımcı olur.

Varsayılan en düşük hız, 5 saniye yetkisiz kullanım süresiyle 240 bayt/saniyedir.

Yanıt için en düşük oran da geçerlidir. İstek sınırını ve yanıt sınırını ayarlama kodu, özellik ve arabirim adlarına sahip veya Response olması RequestBody dışında aynıdır.

Aşağıda, içinde en düşük veri oranlarının nasıl yapılandırıldığını gösteren bir örnek verilmişti Program.cs:

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

Ara yazılımda istek başına en düşük hız sınırlarını geçersiz kılın:

app.Run(async (context) =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>()
        .MaxRequestBodySize = 10 * 1024;

    var minRequestRateFeature = 
        context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
    var minResponseRateFeature = 
        context.Features.Get<IHttpMinResponseDataRateFeature>();

    if (minRequestRateFeature != null)
    {
        minRequestRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

    if (minResponseRateFeature != null)
    {
        minResponseRateFeature.MinDataRate = new MinDataRate(
            bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
    }

IHttpMinResponseDataRateFeature Protokolün istek çoğullama desteği nedeniyle istek başına hız sınırlarının değiştirilmesi genellikle HTTP/2 için desteklenmediğinden, önceki örnekte başvuruda yer alan http/2 istekleri için mevcut HttpContext.Features değildir. Bununla birlikte IHttpMinRequestBodyDataRateFeatureHttpContext.Features, okuma hızı sınırı bir HTTP/2 isteği için eşit olarak ayarlanarak IHttpMinRequestBodyDataRateFeature.MinDataRatenull istek başına tamamen devre dışı bırakılabildiğinden, http/2 istekleri için hala mevcuttur. Okuma IHttpMinRequestBodyDataRateFeature.MinDataRate girişiminde bulunulması veya değerinin dışında null bir değere ayarlanması, http/2 isteği verilip atılmayla sonuçlanır NotSupportedException .

aracılığıyla KestrelServerOptions.Limits yapılandırılan sunucu genelinde hız sınırları, hem HTTP/1.x hem de HTTP/2 bağlantılarına uygulanır.

İstek üst bilgileri zaman aşımı

RequestHeadersTimeout

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

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.MaxConcurrentConnections = 100;
    serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
    serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
    serverOptions.Limits.MinRequestBodyDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Limits.MinResponseDataRate =
        new MinDataRate(bytesPerSecond: 100, 
            gracePeriod: TimeSpan.FromSeconds(10));
    serverOptions.Listen(IPAddress.Loopback, 5000);
    serverOptions.Listen(IPAddress.Loopback, 5001, 
        listenOptions =>
        {
            listenOptions.UseHttps("testCert.pfx", 
                "testPassword");
        });
    serverOptions.Limits.KeepAliveTimeout = 
        TimeSpan.FromMinutes(2);
    serverOptions.Limits.RequestHeadersTimeout = 
        TimeSpan.FromMinutes(1);
})

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

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

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

Varsayılan değer 100 şeklindedir.

Üst bilgi tablosu boyutu

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

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

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

Maksimum çerçeve boyutu

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 gösterir. Değer sekizli olarak sağlanır ve 2^14 (16.384) ile 2^24-1 (16.777.215) arasında olmalıdır.

webBuilder.ConfigureKestrel(serverOptions =>
{
    serverOptions.Limits.Http2.MaxFrameSize = 16384;
});

Varsayılan değer 2^14 'tür (16.384).

İstek üst bilgisi boyutu üst sınırı

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

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

Varsayılan değer 8.192'dir.

İlk bağlantı penceresi boyutu

Http2.InitialConnectionWindowSize sunucu arabelleklerinin bağlantı başına tüm istekler (akışlar) arasında bir kerede toplanmış en fazla istek gövdesi verilerini bayt cinsinden gösterir. İstekler ile de sınırlıdır Http2.InitialStreamWindowSize. Değer 65.535'ten büyük veya buna eşit ve 2^31'den küçük olmalıdır (2.147.483.648).

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

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

İlk akış penceresi boyutu

Http2.InitialStreamWindowSize , sunucu tarafından istek başına bir kerede arabelleğe alınan en yüksek istek gövdesi verilerini bayt cinsinden gösterir (akış). İstekler ile de sınırlıdır Http2.InitialConnectionWindowSize. Değer 65.535'ten büyük veya buna eşit ve 2^31'den küçük olmalıdır (2.147.483.648).

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

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

Römork

HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.

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 , römorkların yanıt için desteklendiğini güvence altına alır.
  • DeclareTrailer verilen römork adını yanıt üst bilgisine Trailer ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsa DeclareTrailer , yanıt üst bilgileri gönderilmeden önce olmalıdır.
  • AppendTrailer römorku ekler.

Reset

Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.

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

Reset yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR . HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.

Zaman Uyumlu G/Ç

AllowSynchronousIO istek ve yanıt için zaman uyumlu G/Ç'ye izin verilip verilmeyeceğini denetler. false varsayılan değerdir.

Uyarı

Çok sayıda zaman uyumlu G/Ç işleminin engellenmesi iş parçacığı havuzu aç kalmasına neden olabilir ve bu da uygulamanın yanıt vermemesine neden olabilir. Yalnızca zaman uyumsuz G/Ç'yi desteklemeyen bir kitaplık kullanırken etkinleştirin AllowSynchronousIO .

Aşağıdaki örnek zaman uyumlu G/Ç'yi etkinleştirir:

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

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

Uç nokta yapılandırması

Varsayılan olarak, ASP.NET Core şu şekilde bağlanır:

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

URL'leri belirtmek için şunları kullanın:

  • ASPNETCORE_URLS ortam değişkeni.
  • --urls komut satırı bağımsız değişkeni.
  • urls ana bilgisayar yapılandırma anahtarı.
  • UseUrls uzantı 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 olarak yapılandırın (örneğin, "Urls": "http://localhost:8000;http://localhost:8001").

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

Geliştirme sertifikası oluşturulur:

Bazı tarayıcılar, yerel geliştirme sertifikasına güvenmek için açık izin verilmesini gerektirir.

Proje şablonları, uygulamaları varsayılan olarak HTTPS üzerinde çalışacak şekilde yapılandırıp HTTPS yeniden yönlendirme ve HSTS desteği içerir.

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

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

KestrelServerOptions Yapılandırma:

ConfigureEndpointDefaults(Eylem<DinleyicisiSeçenekler>)

Belirtilen her uç nokta için çalıştırılacak bir yapılandırma Action belirtir. Birden çok kez çağrılması ConfigureEndpointDefaults , öncekileri Actionbelirtilen son Action değerle değiştirir.

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

Dekont

Çağrıdan ConfigureEndpointDefaults önce çağrılarak Listenoluşturulan uç noktalarda varsayılan değerler uygulanmaz.

YapılandırHttpsDefaults(Eylem<Https Bağlan ionAdapterOptions>)

Her HTTPS uç noktası için çalıştırılacak yapılandırmayı Action belirtir. Birden çok kez çağrılması ConfigureHttpsDefaults , öncekileri Actionbelirtilen son Action değerle değiştirir.

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

Dekont

Çağrıdan ConfigureHttpsDefaults önce çağrılarak Listenoluşturulan uç noktalarda varsayılan değerler uygulanmaz.

Configure(IConfiguration)

Giriş olarak alan IConfiguration bir yapılandırma yükleyicisi oluştururKestrel. Yapılandırmanın kapsamı için Kestrelyapılandırma bölümü olarak belirlenmiş olmalıdır.

ListenOptions.UseHttps

HTTPS kullanmak için yapılandırın Kestrel .

ListenOptions.UseHttps Uzantı -ları:

  • UseHttps: HTTPS'yi varsayılan sertifikayla kullanacak şekilde yapılandırın Kestrel . 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 , öğesini yapılandırmak için bir Action 'dir HttpsConnectionAdapterOptions. ListenOptionsdöndürür.
  • storeName , sertifikanın yüklendiği sertifika deposudur.
  • subject sertifikanın konu adıdır.
  • allowInvalid otomatik olarak imzalanan sertifikalar gibi geçersiz sertifikaların dikkate alınması gerekip gerekmediğini gösterir.
  • location , sertifikanın yüklenecek depo konumudur.
  • serverCertificate X.509 sertifikasıdır.

Üretimde HTTPS açıkça yapılandırılmalıdır. En azından varsayılan bir sertifika sağlanmalıdır.

Desteklenen yapılandırmalar aşağıda açıklanmıştır:

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

Yapılandırma yok

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

Varsayılan sertifikayı yapılandırmadan değiştirme

CreateDefaultBuildervarsayılan olarak yapılandırmayı yüklemek Kestrel için çağırırConfigure(context.Configuration.GetSection("Kestrel")). için Kestrelvarsayılan BIR HTTPS uygulama ayarları yapılandırma şeması sağlanır. Disk üzerindeki bir dosyadan veya bir sertifika deposundan URL'ler ve kullanılacak sertifikalar dahil olmak üzere birden çok uç nokta yapılandırın.

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

  • Geçersiz sertifikaların (örneğin, otomatik olarak imzalanan sertifikalar) kullanılmasına izin vermek için AllowInvalidtrue olarak ayarlayın.
  • Sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte HttpsDefaultCert), Sertifika 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 bir alternatifi, sertifika deposu 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/küçük harfe duyarlı değildir. Örneğin ve HTTPSHttps geçerlidir.
  • Url Parametresi 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 alır. aracılığıyla Listen kodda tanımlanan uç noktalar, yapılandırma bölümünde tanımlanan uç noktalarla birikmeli olarak bulunur.
  • Bölüm Certificate isteğe bağlıdır. Certificate Bölüm belirtilmezse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Kullanılabilir varsayılan ayar yoksa, sunucu bir özel durum oluşturur ve başlatılamaz.
  • Certificate bölümü hem YolParola hem de Konu-Depolama sertifikalarını destekler.
  • Bağlantı noktası çakışmalarına neden olmayan herhangi bir sayıda uç nokta bu şekilde tanımlanabilir.
  • options.Configure(context.Configuration.GetSection("{SECTION}"))KestrelConfigurationLoader, yapılandırılmış bir .Endpoint(string name, listenOptions => { }) uç noktanın ayarlarını desteklemek için kullanılabilecek bir yöntemle 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 CreateDefaultBuildersağlanan gibi mevcut yükleyicide yinelemeye devam etmek için doğrudan erişilebilir.

  • Her uç noktanın yapılandırma bölümü, özel ayarların okunabilmesi için yöntemindeki Endpoint 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 çağrılmadığı sürece Load yalnızca son yapılandırma kullanılır. Meta paket çağrısı Load yapmaz, böylece varsayılan yapılandırma bölümü değiştirilebilir.
  • KestrelConfigurationLoaderListen, API KestrelServerOptions ailesini aşırı yükleme olarak Endpoint 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 , önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma dahil olmak üzere ve için varsayılan ayarları değiştirmek için ListenOptionsHttpsConnectionAdapterOptionskullanı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 SNI desteği

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

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

SNI desteği şunları gerektirir:

  • Hedef çerçevede netcoreapp2.1 veya sonraki sürümlerde çalışıyor. Veya daha sonraki bir tarihte net461 geri arama çağrılır, ancak name her zaman nullolur. name ayrıcanull, istemci TLS el sıkışmasında ana bilgisayar adı parametresini sağlamazsa da olur.
  • Tüm web siteleri aynı Kestrel örnekte çalışır. Kestrel ip adresini ve bağlantı noktasını ters ara sunucu olmadan birden çok örnek arasında paylaşmayı 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ğlan günlük kaydı

Bağlantıda bayt düzeyi iletişim için Hata ayıklama düzeyi günlükleri yaymak için çağrısı UseConnectionLogging yapın. Bağlan günlük kaydı, TLS şifrelemesi sırasında ve ara sunucuların arkasında olduğu gibi düşük düzeyli iletişimdeki sorunları gidermek için yararlıdır. önüne UseHttpsyerleştirilirse UseConnectionLogging şifrelenmiş trafik günlüğe kaydedilir. sonra yerleştirilirse UseConnectionLoggingUseHttps, şifresi çözülen trafik günlüğe kaydedilir.

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

TCP yuvasına bağlama

Listen yöntemi bir TCP yuvasına bağlanır ve lambda seçenekleri X.509 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, ile ListenOptionsbir uç nokta için HTTPS'yi yapılandırıyor. Belirli uç noktaların diğer Kestrel ayarlarını yapılandırmak için aynı API'yi kullanın.

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

macOS, Linux ve Windows'da sertifikalar OpenSSL kullanılarak oluşturulabilir.

Unix yuvasına bağlama

Bu örnekte gösterildiği gibi Nginx ile geliştirilmiş performans için ile unix yuvasını ListenUnixSocket 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 girdisini server>proxy_pass>locationolarak http://unix:/tmp/{KESTREL SOCKET}:/;ayarlayın. {KESTREL SOCKET} , verilen ListenUnixSocket yuvanın 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 belirtildiğinde, Kestrel kullanılabilir bir bağlantı noktasına dinamik olarak bağlanır. Aşağıdaki örnekte çalışma zamanında hangi bağlantı noktasının Kestrel bağlandığının nasıl belirlendiği gösterilmektedir:

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ışı, uygulamaya ulaşabileceğiniz 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ırın:

  • 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, dışındaki Kestrelsunucularla kod çalışması için kullanışlıdır. Ancak aşağıdaki sınırlamalara dikkat edin:

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

IIS uç noktası yapılandırması

IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya UseUrlstarafından Listen ayarlanır. Daha fazla bilgi için ASP.NET Temel Modülü konusuna bakın.

ListenOptions.Protocols

özelliği, Protocols bir bağlantı uç noktasında veya sunucu için etkinleştirilen HTTP protokollerini (HttpProtocols) oluşturur. Enum'dan özelliğine Protocols bir değer atayın HttpProtocols .

HttpProtocols sabit listesi değeri Bağlan protokolüne izin verilir
Http1 Yalnızca HTTP/1.1. TLS ile veya TLS olmadan kullanılabilir.
Http2 Yalnızca HTTP/2. TLS olmadan yalnızca istemci Önceki Bilgi modunu destekliyorsa 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'yi seçmesini gerektirir; aksi takdirde, bağlantı varsayılan olarak HTTP/1.1 olur.

Herhangi bir uç nokta için varsayılan ListenOptions.Protocols değer şeklindedir HttpProtocols.Http1AndHttp2.

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

  • TLS sürüm 1.2 veya üzeri
  • Yeniden anlaşma devre dışı bırakıldı
  • Sıkıştırma devre dışı bırakıldı
  • Minimum kısa ömürlü anahtar değişimi boyutları:
    • Eliptik eğri Diffie-Hellman (ECDHE) [RFC4492]: en az 224 bit
    • Sonlu alan Diffie-Hellman (DHE) [TLS12]: 2048 bit minimum
  • Şifre paketi yasak değildir.

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [TLS-ECDHE] ile P-256 üç nokta 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ğlan ions, sağlanan bir sertifikayla TLS tarafından güvence altına alınır:

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

Gerekirse, tls el sıkışmalarını belirli şifreler için bağlantı başına göre filtrelemek için Bağlan ion Ara Yazılımı kullanın.

Aşağıdaki örnek, uygulamanın desteklemediği herhangi bir şifreleme algoritması için oluşturur NotSupportedException . Alternatif olarak, ITlsHandshakeFeature.CipherAlgorithm öğesini tanımlayıp kabul edilebilir şifreleme paketlerinin listesiyle karşılaştırın.

CipherAlgorithmType.Null şifreleme algoritması ile ş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ğlan ion filtrelemesi bir IConnectionBuilder lambda aracılığıyla da yapılandırılabilir:

// 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 TLS CipherSuitesPolicy el sıkışmalarını bağlantı başına göre 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,
                    // ...
                });
        };
    });
});

Yapılandırmadan protokolü ayarlama

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

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

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

Aşağıdaki appsettings.json örnekte, belirli bir uç nokta için HTTP/1.1 bağlantı protokolü oluşturulur:

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

Yapılandırmaya göre ayarlanan kod geçersiz kılma değerlerinde belirtilen protokoller.

URL ön ekleri

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

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

  • 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ıyla IPv6 adresi

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

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

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

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

    Ana bilgisayar adları , *ve +ö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ı konak adlarını aynı bağlantı noktasındaki farklı ASP.NET Core uygulamalarına bağlamak için HTTP.sys veya IIS, Nginx veya Apache gibi bir ters ara sunucu kullanın.

    Uyarı

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

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

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

    Belirtildiğinde localhost , Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerine bağlanmaya çalışır. İstenen bağlantı noktası herhangi bir geri döngü arabiriminde başka bir hizmet tarafından kullanılıyorsa başlatılamaz Kestrel . Geri döngü arabirimi herhangi bir nedenle kullanılamıyorsa (en yaygın olarak IPv6 desteklenmediğinden), Kestrel bir uyarı günlüğe kaydeder.

Konak filtreleme

gibi http://example.com:5000Kestrel ön ekleri temel alan yapılandırmayı desteklese deKestrel, konak adını büyük ölçüde yoksayar. Konak localhost , geri döngü adreslerine bağlama için kullanılan özel bir durumdur. Açık IP adresi dışındaki tüm konaklar tüm genel IP adreslerine bağlanır. Host üst bilgiler doğrulanmaz.

Geçici bir çözüm olarak Konak Filtreleme Ara Yazılımını kullanın. Konak Filtreleme Ara Yazılımı, ASP.NET Core uygulamaları için örtük olarak sağlanan Microsoft.AspNetCore.HostFiltering paketi tarafından sağlanır. Ara yazılım tarafından CreateDefaultBuildereklenir ve öğesini ç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>();
}

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

appsettings.json:

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

Dekont

İletilen Üst Bilgiler Ara Yazılımının da bir AllowedHosts seçeneği vardır. İletilen Üst Bilgiler Ara Yazılımı ve Konak Filtreleme Ara Yazılımı, farklı senaryolar için benzer işlevlere sahiptir. AllowedHosts İletilen Üst Bilgiler Ara Yazılımı ayarı, istekleri ters ara sunucu veya yük dengeleyici ile iletirken üst bilgi korunmadığında Host uygundur. Genel kullanıma yönelik bir kenar sunucusu olarak kullanıldığında veya üst bilgi doğrudan iletildiğinde Host Konak Filtreleme Ara Yazılımı ile ayarlama AllowedHosts uygundurKestrel.

İletilen Üst Bilgiler Ara Yazılımı hakkında daha fazla bilgi için bkz . ASP.NET Çekirdeği ara sunucularla ve yük dengeleyicilerle çalışacak şekilde yapılandırma.

Libuv aktarım yapılandırması

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

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

    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv"
                      Version="{VERSION}" />
    
  • üzerinde çağrısı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 isteği boşaltma

HTTP bağlantılarını açmak zaman alır. HTTPS için de yoğun kaynak kullanır. Bu nedenle, Kestrel HTTP/1.1 protokolü başına bağlantıları yeniden oluşturmaya çalışır. Bağlantının yeniden kullanılmasına izin vermek için bir istek gövdesinin tamamen kullanılması gerekir. Uygulama, sunucunun yeniden yönlendirme veya 404 yanıtı döndürdüğü istekler gibi POST istek gövdesini her zaman kullanmaz. POST-redirect durumunda:

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

Boşaltma işlemi, bağlantının yeniden kullanılmasına izin verme ile kalan verilerin boşaltılması için gereken süre arasında bir denge sağlar:

  • Boşaltma beş saniyelik bir zaman aşımına sahiptir ve bu da yapılandırılamaz.
  • veya Transfer-Encoding üst bilgisi tarafından Content-Length belirtilen tüm veriler zaman aşımından önce okunmamışsa, bağlantı kapatılır.

Bazen yanıtı yazmadan önce veya yazdıktan sonra isteği hemen sonlandırmak isteyebilirsiniz. Örneğin, istemcilerin kısıtlayıcı veri üst sınırları olabilir, bu nedenle karşıya yüklenen verilerin sınırlanması öncelikli olabilir. Bu gibi durumlarda bir isteği sonlandırmak için bir denetleyiciden, Razor Sayfadan veya ara yazılımdan HttpContext.Abort'u çağırın.

çağrılması Abortgereken uyarılar vardır:

  • Yeni bağlantılar oluşturmak yavaş ve pahalı olabilir.
  • bağlantı kapanmadan önce istemcinin yanıtı okuduğunun garantisi yoktur.
  • Çağrı Abort nadir olmalı ve sık karşılaşılan hatalar için değil, ciddi hata durumları için ayrılmalıdır.
    • Yalnızca belirli bir sorunun çözülmesi gerektiğinde arayın Abort . Örneğin, kötü amaçlı istemciler verileri deniyorsa POST veya istemci kodunda büyük veya çok sayıda isteğe neden olan bir hata varsa çağrısında Abort bulunarak.
    • HTTP 404 (Bulunamadı) gibi yaygın hata durumlarını çağırmayın Abort .

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

Protokol, bağlantıyı kapatmadan tek tek istek akışlarını durdurmayı desteklediğinden bu işlem HTTP/2 için farklıdır. Beş saniyelik boşaltma zaman aşımı geçerli değildir. Yanıt tamamlandı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 bilgisini kullanmaları ve istek gövdesini göndermeye başlamadan önce sunucunun yanıt vermesini beklemeleri daha iyidir. Bu, istemciye gereksiz verileri göndermeden önce yanıtı inceleme ve durdurma fırsatı verir.

Ek kaynaklar