Kestrel ASP.NET Core'da web sunucusu

Note

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

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:
    • ASP.NET uygulama çerçeveleri, Minimal API'ler, MVC, Razor, sayfalar, SignalR, Blazor, ve gRPC gibi.
    • YARP kullanarak 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 Ölçümler ve günlüğe kaydetme gibi yerleşik performans tanılama özellikleri sağlar.
  • Bellek yönetimi:Kestrel verimli bellek yönetimi için özellikler içerir. Daha fazla bilgi için Kestrel üzerindeki bellek yönetimine bakınız.

Get started

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.cs içinde, WebApplication.CreateBuilder yöntemi UseKestrel'yi dahili olarak çağırır.

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

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

app.Run();

Daha fazla bilgi için WebApplication ve WebApplicationBuilder yapılandırması hakkında Minimal API'ler hızlı referansına bakın.

Ek kaynaklar

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, Blazor, ve gRPC gibi ASP.NET uygulama çerçeveleri.
    • 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ük kaydı ve ölçümler gibi yerleşik performans tanılama özellikleri sunar.

Get started

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.cs, UseKestrel yöntemini WebApplication.CreateBuilder içinde dahili olarak çağırır.

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

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

app.Run();

Daha fazla bilgi için WebApplication ve WebApplicationBuilder'i yapılandırma, bkz Minimal API'ler kısa referansı.

Hata ayıklayıcı bağlıyken 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

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:

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

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

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

Get started

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.cs içinde, WebApplication.CreateBuilder yöntemi UseKestrel'yi dahili olarak çağırır.

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

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

app.Run();

Daha fazla bilgi için WebApplication ve WebApplicationBuilder yapılandırması hakkında Minimal API'ler hızlı referansına bakın.

Hata ayıklayıcı bağlıyken 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

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:

  • 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, gelecekteki bir sürümde macOS'ta desteklenecektir.

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

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

Get started

ASP.NET Çekirdek proje şablonları, IIS ile barındırılmadığında varsayılan olarak kullanır Kestrel . Program.cs'de ConfigureWebHostDefaults'yi çağıran yöntem 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.

Ek kaynaklar

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:

  • 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 dışında†)

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

Kestrel , .NET'in 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 sunucuyla Kestrel ne zaman kullanılır?

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 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 İnternet ile dolaylı olarak 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ı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.
  • Ekstra bir yapılandırma katmanı ve derinlemesine savunma stratejisi sağlayarak siber güvenlik seviyesini artırı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.

Warning

Ters proxy yapılandırmasında barındırmak için İletilen Üst Bilgiler Middleware yapılandırması gerekir.

Kestrel ASP.NET Core uygulamalarında

ASP.NET Core proje şablonları varsayılan olarak kullanır Kestrel . Program.cs'de ConfigureWebHostDefaults'yi çağıran yöntem 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.

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

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 Kestrel veya appsettings.json dosyasından yapılandırma yükleyebilirappsettings.{Environment}.json:

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

Note

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:

  • Kestrel öğesini Startup.ConfigureServices içinde yapılandırın.

    1. IConfiguration örneğini Startup sınıfına enjekte et. Aşağıdaki örnekte eklenen yapılandırmanın özelliğine Configuration atandığı varsayılır.

    2. Startup.ConfigureServices içinde, yapılandırmanın Kestrel bölümünü Kestrel'nin yapılandırmasına yü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 Kestrel yapılandırma:

    Önce Program.cs'da, Kestrel yapılandırma bölümünü Kestrel'nin yapılandırmasına yü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.

Bağlantıyı açık 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 yükseltilen bağlantılar için ayrı bir sınır vardır (örneğin, bir WebSockets isteğinde). Yükseltilmiş bir bağlantı, MaxConcurrentConnections sınırına karşı 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 veri 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 bir isteği okumaya başladıktan sonra, istek üzerindeki sınırı yapılandırırsa bir özel durum fırlatılır. Özelliğin salt okunur durumda olup olmadığını IsReadOnly belirten bir MaxRequestBodySize özellik vardır; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.

Uygulama ASP.NET Çekirdek Modülünün arkasında bağımsız işlem olarak çalıştırıldığında, IIS sınırını zaten ayarlamış olduğu için istek gövdesi boyutu sınırı devre dışı bırakılmıştı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ğrar. Hoşgörü süresi, istemciye gönderim hızını minimuma kadar artırması için verilen süredir Kestrel; bu süre zarfında oran kontrol edilmez. 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ındaki RequestBody veya Response dışında, aynıdır.

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

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

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

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

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

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

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

Önceki örnekte belirtilen IHttpMinResponseDataRateFeature referansı, HTTP/2 protokolünün istek çoğullama desteği nedeniyle istek başına hız sınırlarının değiştirilmesi genel olarak desteklenmediğinden, HTTP/2 istekleri için HttpContext.Features'de mevcut değildir. Bununla birlikte, HTTP/2 istekleri için IHttpMinRequestBodyDataRateFeatureHttpContext.Features hala mevcut çünkü okuma hızı sınırı, IHttpMinRequestBodyDataRateFeature.MinDataRatenull ayarlanarak istek başına tamamen devre dışı bırakılabilir, hatta bir HTTP/2 isteği için bile. IHttpMinRequestBodyDataRateFeature.MinDataRate okunmaya çalışılması veya null dışında bir değere ayarlanması, bir HTTP/2 isteği sonucunda NotSupportedException istisnasının fırlatılmasına neden olacaktır.

KestrelServerOptions.Limits üzerinden yapılandırılan sunucu genelindeki hız sınırları, hem HTTP/1.x hem de HTTP/2 bağlantılarına uygulanmaya devam eder.

İstek başlıkları 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 çözücü, HTTP/2 bağlantıları için HTTP üst bilgilerini dekomprese eder. Http2.HeaderTableSize HPACK kod çözücüsünün kullandığı üst bilgi sıkıştırma tablosunun boyutunu sınırlar. Değer bayt 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 maksimum boyutu

Http2.MaxRequestHeaderFieldSize, istek üst bilgisi değerlerinin sekiz bitlik oktet cinsinden 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 sunucunun, her bağlantı başına tüm istekler (akışlar) arasında aynı anda topladığı ve bayt cinsinden arabelleklediği en fazla istek gövdesi verisini gösterir. İstekler de sınırlandırılı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 Http2.InitialConnectionWindowSize ile de sınırlıdır. 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).

Trailers

HTTP Fragmanlar, HTTP Üst Bilgileri'ne 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. DeclareTrailer çağrılırsa, 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 iptal edildiği 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.

Senkron Girdi/Çıktı

AllowSynchronousIO istek ve yanıt için senkron G/Ç'ye izin verilip verilmeyeceğini denetler. Varsayılan değer şudur: false.

Warning

Ç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. AllowSynchronousIO yalnızca zaman uyumsuz G/Ç'yi desteklemeyen bir kitaplık kullanırken etkinleştirin.

Aşağıdaki örnek eşzamanlı 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 host yapılandırma anahtarı.
  • UseUrls genişletme metodu.

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 Sunucu URL'leri ve Geçersiz kılma yapılandırması bölümüne bakın.

Geliştirme sertifikası oluşturulur:

  • .NET SDK yüklendiğinde.
  • Dev-certs aracı bir sertifika oluşturmak için kullanılır.

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.

URL ön eklerini ve bağlantı noktalarını Kestrel için yapılandırmak üzere KestrelServerOptions üzerinde Listen veya ListenUnixSocket yöntemlerini çağırı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 konfigürasyon:

ConfigureEndpointDefaults(Aksiyon<DinlemeSeçenekleri>)

Belirtilen her uç nokta için çalıştırılacak bir yapılandırma Action belirtir. ConfigureEndpointDefaults'i birden çok kez çağırmak, önceki Action'leri belirtilen son Action ile değiştirir.

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

Note

Çağrıdan Listen önceoluşturulan uç noktalarda varsayılan değerler uygulanmaz.

YapılandırHttpsDefaults(Eylem<HttpsConnectionAdapterOptions>)

Her HTTPS uç noktası için çalıştırılacak yapılandırmayı Action belirtir. Birden çok kez çağrılan ConfigureHttpsDefaults, önceki Action'leri belirlenen son Action ile değiştirir.

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

Note

Listen çağrılmadan önce oluşturulan uç noktalarda varsayılan değerler uygulanmaz.

Configure(IConfiguration)

IConfiguration giriş olarak alan Kestrel için bir yapılandırma yükleyicisi oluşturur. Yapılandırma, Kestrel yapılandırma bölümü ile sınırlandırılmalıdır.

ListenOptions.UseHttps

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

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. ListenOptions dö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

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

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

CreateDefaultBuilder varsayılan olarak Kestrel yapılandırmasını yüklemek için Configure(context.Configuration.GetSection("Kestrel")) çağırır. Kestrel için varsayı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:

  • AllowInvalid ayarını true olarak ayarlayarak geçersiz sertifikaların kullanılmasına izin verin (örneğin, kendiliğinden imzalı sertifikalar).
  • 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, HTTPS ve Https 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. Kodda Listen aracılığıyla tanımlanan uç noktalar, yapılandırma bölümünde tanımlanan uç noktalarla birikimli olarak kullanılır.
  • 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 KonuDepo sertifikalarını destekler.
  • Çakışmalara neden olmayan bağlantı noktaları olduğu sürece, bu şekilde herhangi bir sayıda uç nokta tanımlanabilir.
  • options.Configure(context.Configuration.GetSection("{SECTION}")) bir KestrelConfigurationLoader döndürür, bu yöntem yapılandırılmış bir .Endpoint(string name, listenOptions => { }) uç noktanın ayarlarını desteklemek için kullanılabilir.
webBuilder.UseKestrel((context, serverOptions) =>
{
    serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
        .Endpoint("HTTPS", listenOptions =>
        {
            listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
        });
});

KestrelServerOptions.ConfigurationLoader, örneğin CreateDefaultBuilder tarafından sağlanan 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 options.Configure(context.Configuration.GetSection("{SECTION}")) yeniden çağrılarak 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.
  • KestrelConfigurationLoader, Endpoint üzerinden Listen API ailesini yansıtır, bu sayede 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ılmak dahil ListenOptions ve HttpsConnectionAdapterOptions için varsayılan ayarları değiştirmek amacıyla 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 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, ServerCertificateSelector geri çağırma yoluyla SNI'yi destekler. Uygulamanın konak adını incelemesine ve uygun sertifikayı seçmesine izin vermek için her bağlantıda bir kez geri arama çalıştırılır.

SNI desteği şunları gerektirir:

  • Hedef platformda netcoreapp2.1 veya yeni sürümlerde çalışabilir. Veya daha sonraki bir tarihte net461 geri arama çağrılır, ancak name her zaman nullolur. name ayrıca null, istemci TLS el sıkışmasında ana bilgisayar adı parametresini sağlamazsa da geçerlidir.
  • 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ğlantı Kaydı

Bağlantıda bayt düzeyinde iletişim için Hata ayıklama seviyesinde günlükleri yaymak üzere UseConnectionLogging çağrısını yapın. Bağlantı günlüğü, TLS şifrelemesi sırasında ve ara sunucuların arkasında olduğu gibi düşük düzeyli iletişim sorunlarını gidermek için yararlıdır. Eğer UseConnectionLogging, UseHttps'den önce yerleştirilirse şifrelenmiş trafik günlüğe kaydedilir. UseConnectionLogging UseHttps'den sonra 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

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, ListenOptions ile bir uç nokta için HTTPS'yi yapılandırır. Belirli uç noktaların diğer Kestrel ayarlarını yapılandırmak için aynı API'yi kullanın.

Windows, otomatik olarak imzalanan sertifikalar New-SelfSignedCertificate PowerShell cmdlet kullanılarak oluşturulabilir. Desteklenmeyen bir örnek için GitHub UpdateIISExpressSSLForChrome.ps1 sertifika dosyasına bakın.

macOS, Linux ve Windows'da OpenSSL kullanılarak sertifika oluşturabilirsiniz.

Unix yuvasına bağlama

Bu örnekte gösterildiği gibi, Nginx ile geliştirilmiş performans için ListenUnixSocket üzerinden bir Unix yuvası üzerinde 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>location>proxy_passolarak http://unix:/tmp/{KESTREL SOCKET}:/;ayarlayın. {KESTREL SOCKET} sağlanan ListenUnixSocket yuvasının adıdır (önceki örnekte kestrel-test.sock örneğin).
  • Soketin Nginx tarafından yazılabilir durumda 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

Limitations

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

  • HTTPS uç nokta yapılandırmasında varsayılan bir sertifika sağlanmadıkça, HTTPS bu yaklaşımlarla kullanılamaz (örneğin, KestrelServerOptions yapılandırması veya bu konuda daha önce gösterildiği gibi bir yapılandırma dosyası kullanarak).
  • Her iki Listen ve UseUrls yaklaşımları aynı anda kullanıldığında, Listen uç noktalar UseUrls uç noktalarını geçersiz kılar.

IIS uç noktası yapılandırması

IIS kullanırken, IIS'teki URL bağlamaları Listen veya UseUrls tarafından geçersiz kılma bağlamaları olarak 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. HttpProtocols enum'dan Protocols özelliğine bir değer atayın.

HttpProtocols enum değeri Bağlantı 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 müzakere devre dışı bırakıldı
  • Sıkıştırma devre dışı bırakıldı
  • Minimum geçici 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
  • Şifreleme 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ğlantıların güvenliği, sağlanan bir sertifikayla TLS tarafından sağlanır:

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

Gerekirse, TLS el sıkışmalarını belirli şifrelemeler için bağlantı başına temelinde filtrelemek için Bağlantı Ara Yazılımı'nı kullanın.

Aşağıdaki örnek, uygulamanın desteklemediği herhangi bir şifre algoritması için NotSupportedException atar. 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ğlantı filtreleme 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

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

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"
      }
    }
  }
}

Kodda belirtilen protokoller, yapılandırmadaki ayarları geçersiz kılar.

URL ön ekleri

UseUrls, --urls komut satırı bağımsız değişkeni, urls konak yapılandırma anahtarı veya ASPNETCORE_URLS ortam değişkeni kullanırken, 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.

  • Port 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.

    Warning

    Ters proxy yapılandırmasında barındırmak için İletilen Üst Bilgiler Middleware yapılandırması gerekir.

  • Bağlantı noktası numarasıyla ana bilgisayar adı veya bağlantı noktası numarasıyla geri döngü IP'si

    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 Kestrel başlatılamıyor. Geri döngü arabirimlerinden herhangi biri herhangi bir nedenle kullanılamıyorsa (çoğunlukla IPv6 desteklenmediğinden), Kestrel bir uyarı kaydeder.

Konak filtreleme

gibi Kestrel ön eklerine dayalı yapılandırmayı desteklese de http://example.com:5000, Kestrel konak adını büyük ölçüde görmezden gelir. Host localhost, geri döngü adreslerine bağlanmak için kullanılan özel bir durumdur. Belirli bir IP adresi dışında herhangi bir konak, tüm genel IP adreslerine bağlanır. Host başlıklar doğrulanmaz.

Geçici bir çözüm olarak Host Filtreleme Ara Katman yazılımını kullanın. Host Filtering Middleware, ASP.NET Core uygulamaları için otomatik olarak sağlanan Microsoft.AspNetCore.HostFiltering paketi tarafından sağlanır. Ara yazılım, CreateDefaultBuilder tarafından eklenir ve AddHostFiltering çağrılır.

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 AllowedHostsappsettings.json/bir appsettings.{Environment}.json anahtar tanımlayın. Port numaraları içermeyen ana bilgisayar adlarının noktalı virgülle ayrılmış bir listesidir:

appsettings.json:

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

Note

İ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. AllowedHosts Konak Filtreleme Ara Yazılımı ile ayarlama, Kestrel genel kullanıma yönelik bir kenar sunucusu olarak kullanıldığında veya Host üst bilgisi doğrudan iletildiğinde uygundur.

İletilen Üst Bilgiler Ara Yazılımı hakkında daha fazla bilgi için, proxy sunucular ve yük dengeleyiciler ile çalışacak şekilde ASP.NET Core'u yapılandırma bölümüne bakın.

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}" />
    
  • UseLibuv üzerinden IWebHostBuilder numarasını ara

    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 süzme

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. Bir istek gövdesinin tamamen tüketilmesi, bağlantının yeniden kullanılmasına izin verir. 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şleme tabi tutmadan okuyup atmak 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.
  • Eğer Content-Length veya Transfer-Encoding başlığı tarafından 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 yüklenen verilerin sınırlandırılması öncelikli 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.

Abort çağrılması konusunda bazı kısıtlamalar vardır.

  • Yeni bağlantılar oluşturmak yavaş ve pahalı olabilir.
  • bağlantı kapanmadan önce istemcinin yanıtı okuduğunun garantisi yoktur.
  • Abort çağrısı nadiren kullanılmalı ve sık rastlanan hatalar için değil, yalnızca ciddi hata durumları için öngörülmelidir.
    • Yalnızca belirli bir sorunun çözülmesi gerektiğinde arayın Abort . Örneğin, kötü amaçlı istemciler verileri erişmeye veya değiştirmeye çalışıyorsa Abort veya istemci kodunda büyük ya da çok sayıda isteğe neden olan bir hata varsa, POST’e başvurun.
    • 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 isteğe ait gövde veri çerçeveleri göz ardı edilir.

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