Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- HTTP/1.1, HTTP/2 ve HTTP/3
- WebSockets
- 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
- Web sunucusu için Kestrel uç noktaları yapılandırma
- ASP.NET Core Kestrel web sunucusu seçeneklerini yapılandırma
- ASP.NET Core Kestrel web sunucusuyla HTTP/2 kullanma
- ASP.NET Core Kestrel web sunucusu ile ters ara sunucu ne zaman kullanılır?
- ASP.NET Core Kestrel web sunucusu ile host filtreleme
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core'da HTTPS'i zorunlu kılma
- ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma
- RFC 9110: HTTP Semantiği (Bölüm 7.2: Konak ve :yetkili)
- Linux'ta UNIX yuvaları kullanılırken, uygulama kapatıldığında yuva otomatik olarak silinmez. Daha fazla bilgi için bu GitHub konusuna bakın.
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:
- HTTP/1.1, HTTP/2 ve HTTP/3
- WebSockets
- 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:
- KestrelServerLimits.KeepAliveTimeout
- KestrelServerLimits.RequestHeadersTimeout
- KestrelServerLimits.MinRequestBodyDataRate
- KestrelServerLimits.MinResponseDataRate
- IConnectionTimeoutFeature
- IHttpMinRequestBodyDataRateFeature
- IHttpMinResponseDataRateFeature
Ek kaynaklar
- Web sunucusu için Kestrel uç noktaları yapılandırma
- ASP.NET Core Kestrel web sunucusu seçeneklerini yapılandırma
- ASP.NET Core Kestrel web sunucusuyla HTTP/2 kullanma
- ASP.NET Core Kestrel web sunucusu ile ters ara sunucu ne zaman kullanılır?
- ASP.NET Core Kestrel web sunucusu ile konak filtreleme
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core'da HTTPS'i zorunlu kılma
- ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma
- RFC 9110: HTTP Semantiği (Bölüm 7.2: Konak ve :yetkili)
- Linux'ta UNIX yuvaları kullanılırken, uygulama kapatıldığında yuva otomatik olarak silinmez. Daha fazla bilgi için bu GitHub konusuna bakın.
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:
- KestrelServerLimits.KeepAliveTimeout
- KestrelServerLimits.RequestHeadersTimeout
- KestrelServerLimits.MinRequestBodyDataRate
- KestrelServerLimits.MinResponseDataRate
- IConnectionTimeoutFeature
- IHttpMinRequestBodyDataRateFeature
- IHttpMinResponseDataRateFeature
Ek kaynaklar
- Web sunucusu için Kestrel uç noktaları yapılandırma
- ASP.NET Core Kestrel web sunucusu seçeneklerini yapılandırma
- ASP.NET Core Kestrel web sunucusuyla HTTP/2 kullanma
- ASP.NET Core Kestrel web sunucusu ile ters ara sunucu ne zaman kullanılır?
- ASP.NET Core Kestrel web sunucusu ile host filtreleme
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core'da HTTPS'i zorunlu kılma
- ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma
- RFC 9110: HTTP Semantiği (Bölüm 7.2: Konak ve :yetkili)
- Linux'ta UNIX yuvaları kullanılırken, uygulama kapatıldığında yuva otomatik olarak silinmez. Daha fazla bilgi için bu GitHub konusuna bakın.
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
- Web sunucusu için Kestrel uç noktaları yapılandırma
- ASP.NET Core Kestrel web sunucusu seçeneklerini yapılandırma
- ASP.NET Core Kestrel web sunucusuyla HTTP/2 kullanma
- ASP.NET Core Kestrel web sunucusu ile ters ara sunucu ne zaman kullanılır?
- ASP.NET Core Kestrel web sunucusu ile host filtreleme
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core'da HTTPS'i zorunlu kılma
- ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma
- RFC 9110: HTTP Semantiği (Bölüm 7.2: Konak ve :yetkili)
- Linux'ta UNIX yuvaları kullanılırken, uygulama kapatıldığında yuva otomatik olarak silinmez. Daha fazla bilgi için bu GitHub konusuna bakın.
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:
- Internet Information Services (IIS)
- Nginx
- Apache
- YARP: Yine Başka Bir Ters Proxy
Kestrel uç (İnternet'e yönelik) web sunucusu olarak kullanılır:
Kestrel ters ara sunucu yapılandırmasında kullanılır:
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.ConfigureServicesiçinde yapılandırın.IConfigurationörneğiniStartupsınıfına enjekte et. Aşağıdaki örnekte eklenen yapılandırmanın özelliğineConfigurationatandığı varsayılır.Startup.ConfigureServicesiçinde, yapılandırmanınKestrelbö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,Kestrelyapı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ı
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
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ı
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. -
DeclareTrailerverilen römork adını yanıt üst bilgisineTrailerekler. 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. -
AppendTrailerrö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_URLSortam değişkeni. -
--urlskomut satırı bağımsız değişkeni. -
urlshost yapılandırma anahtarı. -
UseUrlsgeniş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 birAction'dirHttpsConnectionAdapterOptions.ListenOptionsdöndürür. -
storeName, sertifikanın yüklendiği sertifika deposudur. -
subjectsertifikanın konu adıdır. -
allowInvalidotomatik olarak imzalanan sertifikalar gibi geçersiz sertifikaların dikkate alınması gerekip gerekmediğini gösterir. -
location, sertifikanın yüklenecek depo konumudur. -
serverCertificateX.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ı
trueolarak 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,
HTTPSveHttpsgeçerlidir. -
UrlParametresi her uç nokta için gereklidir. Bu parametrenin biçimi, tek bir değerle sınırlı olması dışında üst düzeyUrlsyapılandırma parametresiyle aynıdır. - Bu uç noktalar, bunlara eklemek yerine üst düzey
Urlsyapılandırmada tanımlananların yerini alır. KoddaListenaracı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
Certificateisteğe bağlıdır.CertificateBö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. -
Certificatebölümü hem Yol–Parola hem Konu–Depo 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}"))birKestrelConfigurationLoaderdö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
Endpointseç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üreceLoadyalnızca son yapılandırma kullanılır. Meta paket çağrısıLoadyapmaz, böylece varsayılan yapılandırma bölümü değiştirilebilir. -
KestrelConfigurationLoader,EndpointüzerindenListenAPI 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.1veya yeni sürümlerde çalışabilir. Veya daha sonraki bir tarihtenet461geri arama çağrılır, ancaknameher zamannullolur.nameayrıcanull, 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_passolarakhttp://unix:/tmp/{KESTREL SOCKET}:/;ayarlayın.{KESTREL SOCKET}sağlanan ListenUnixSocket yuvasının adıdır (önceki örnektekestrel-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
-
--urlskomut satırı bağımsız değişkeni -
urlskonak yapılandırma anahtarı -
ASPNETCORE_URLSortam 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,
KestrelServerOptionsyapılandırması veya bu konuda daha önce gösterildiği gibi bir yapılandırma dosyası kullanarak). - Her iki
ListenveUseUrlsyaklaşımları aynı anda kullanıldığında,Listenuç noktalarUseUrlsuç 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'ün0.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 veyalocalhosttü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.Libuvbir bağımlılık ekleyin:<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="{VERSION}" />UseLibuv üzerinden
IWebHostBuildernumarasını arapublic 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ü
POSTzaten göndermiş olabilir. - Sunucu 301 yanıtını yazar.
- Önceki istek gövdesindeki
POSTveriler 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-LengthveyaTransfer-Encodingbaş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ışıyorsaAbortveya 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.
- Yalnızca belirli bir sorunun çözülmesi gerektiğinde arayın
Ç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
- Linux'ta UNIX yuvaları kullanılırken, uygulama kapatıldığında yuva otomatik olarak silinmez. Daha fazla bilgi için bu GitHub konusuna bakın.
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core'da HTTPS'i zorunlu kılma
- ASP.NET Core'u ara sunucular ve yük dengeleyicilerle çalışacak şekilde yapılandırma
- RFC 9110: HTTP Semantiği (Bölüm 7.2: Konak ve :yetkili)
ASP.NET Core