Kestrel ASP.NET Core'da web sunucusu
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 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:
- Minimal API'ler, MVC Razor , sayfalar SignalR, , Blazorve gRPC gibi uygulama çerçevelerini ASP.NET.
- YARP ile ters proxy oluşturma.
- Genişletilebilirlik: Yapılandırma, ara yazılım ve özel aktarımlar aracılığıyla özelleştirin Kestrel .
- Performans tanılama:Kestrel Günlüğe kaydetme ve ölçümler gibi yerleşik performans tanılama özellikleri sağlar.
Kullanmaya başlayın
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
WebApplication.CreateBuilder içinde yöntemi dahili olarak çağırırUseKestrel:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
ve yapılandırma WebApplication
hakkında daha fazla bilgi için bkz. En az API hızlı başvurusu.WebApplicationBuilder
İsteğe bağlı istemci sertifikaları
Uygulamanın bir alt kümesini sertifikayla koruması gereken uygulamalar hakkında bilgi için bkz. İsteğe bağlı istemci sertifikaları.
Hata ayıklayıcı eklenmiş davranış
Hata ayıklayıcı bir işleme eklendiğinde Kestrel aşağıdaki zaman aşımları ve hız sınırları uygulanmaz:
- KestrelServerLimits.KeepAliveTimeout
- KestrelServerLimits.RequestHeadersTimeout
- KestrelServerLimits.MinRequestBodyDataRate
- KestrelServerLimits.MinResponseDataRate
- IConnectionTimeoutFeature
- IHttpMinRequestBodyDataRateFeature
- IHttpMinResponseDataRateFeature
Ek kaynaklar
- ASP.NET Core Kestrel web sunucusu için uç noktaları yapılandırma
- yöntemi çağrısının
WebApplication.CreateBuilder
kaynağıUseKestrel
- 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.
Not
ASP.NET Core 5.0 itibarıyla libuv Kestreltaşıması kullanım dışıdır. Libuv aktarım, Windows ARM64 gibi yeni işletim sistemi platformlarını destekleyecek güncelleştirmeleri almaz ve gelecek bir sürümde kaldırılacaktır. Kullanılmayan UseLibuv yönteme yapılan çağrıları kaldırın ve bunun yerine 'nin varsayılan Yuva aktarımını kullanın Kestrel.
KestrelASP.NET Core için platformlar arası bir web sunucusudur. Kestrel , ASP.NET Core proje şablonlarında varsayılan olarak dahil edilen ve etkinleştirilen web sunucusudur.
Kestrel aşağıdaki senaryoları destekler:
- 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 Core'un desteklediği tüm platformlarda ve sürümlerde desteklenir.
Kullanmaya başlayın
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
WebApplication.CreateBuilder içinde yöntemi dahili olarak çağırırUseKestrel:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
ve yapılandırma WebApplication
hakkında daha fazla bilgi için bkz. En az API hızlı başvurusu.WebApplicationBuilder
İsteğe bağlı istemci sertifikaları
Uygulamanın bir alt kümesini sertifikayla koruması gereken uygulamalar hakkında bilgi için bkz. İsteğe bağlı istemci sertifikaları.
Hata ayıklayıcı eklenmiş davranış
Hata ayıklayıcı bir işleme eklendiğinde Kestrel aşağıdaki zaman aşımları ve hız sınırları uygulanmaz:
- KestrelServerLimits.KeepAliveTimeout
- KestrelServerLimits.RequestHeadersTimeout
- KestrelServerLimits.MinRequestBodyDataRate
- KestrelServerLimits.MinResponseDataRate
- IConnectionTimeoutFeature
- IHttpMinRequestBodyDataRateFeature
- IHttpMinResponseDataRateFeature
Ek kaynaklar
- ASP.NET Core Kestrel web sunucusu için uç noktaları yapılandırma
- yöntemi çağrısının
WebApplication.CreateBuilder
kaynağıUseKestrel
- 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.
Not
ASP.NET Core 5.0 itibarıyla libuv Kestreltaşıması kullanım dışıdır. Libuv aktarım, Windows ARM64 gibi yeni işletim sistemi platformlarını destekleyecek güncelleştirmeleri almaz ve gelecek bir sürümde kaldırılacaktır. Kullanılmayan UseLibuv yönteme yapılan çağrıları kaldırın ve bunun yerine 'nin varsayılan Yuva aktarımını kullanın Kestrel.
KestrelASP.NET Core için platformlar arası bir web sunucusudur. Kestrel , ASP.NET Core proje şablonlarında varsayılan olarak dahil edilen ve etkinleştirilen web sunucusudur.
Kestrel aşağıdaki senaryoları destekler:
- 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 Core'un desteklediği tüm platformlarda ve sürümlerde desteklenir.
Örnek kodu görüntüleme veya indirme (indirme)
Kullanmaya başlayın
ASP.NET Çekirdek proje şablonları, IIS ile barındırılmadığında varsayılan olarak kullanır Kestrel . içinde Program.cs
yöntemi şunu ConfigureWebHostDefaults çağırır UseKestrel:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Konağı oluşturma hakkında daha fazla bilgi için ASP.NET Core'da .NET Genel Konağı'nın Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine bakın.
İsteğe bağlı istemci sertifikaları
Uygulamanın bir alt kümesini sertifikayla koruması gereken uygulamalar hakkında bilgi için bkz. İsteğe bağlı istemci sertifikaları.
Ek kaynaklar
- ASP.NET Core Kestrel web sunucusu için 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.
Not
ASP.NET Core 5.0 itibarıyla libuv Kestreltaşıması kullanım dışıdır. Libuv aktarım, Windows ARM64 gibi yeni işletim sistemi platformlarını destekleyecek güncelleştirmeleri almaz ve gelecek bir sürümde kaldırılacaktır. Kullanılmayan UseLibuv yönteme yapılan çağrıları kaldırın ve bunun yerine 'nin varsayılan Yuva aktarımını kullanın Kestrel.
KestrelASP.NET Core için platformlar arası bir web sunucusudur. Kestrel , ASP.NET Core proje şablonlarına varsayılan olarak eklenen web sunucusudur.
Kestrel aşağıdaki senaryoları destekler:
- 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 Core'un desteklediği tüm platformlarda ve sürümlerde desteklenir.
Örnek kodu görüntüleme veya indirme (indirme)
HTTP/2 desteği
Aşağıdaki temel gereksinimler karşılanırsa HTTP/2 , ASP.NET Core uygulamaları için kullanılabilir:
- İşletim sistemi†
- Windows Server 2016/Windows 10 veya üzeri‡
- OpenSSL 1.0.2 veya üzeri yüklü Linux (örneğin, Ubuntu 16.04 veya üzeri)
- Hedef çerçeve: .NET Core 2.2 veya üzeri
- Uygulama Katmanı Protokolü Anlaşması (ALPN) bağlantısı
- TLS 1.2 veya üzeri bağlantısı
†HTTP/2, gelecekteki bir sürümde macOS'ta desteklenecektir. Kestrel‡ Windows Server 2012 R2 ve Windows 8.1'da HTTP/2 desteği sınırlıdır. Bu işletim sistemlerinde kullanılabilen desteklenen TLS şifreleme paketlerinin listesi sınırlı olduğundan destek sınırlıdır. TLS bağlantılarının güvenliğini sağlamak için Eliptik Eğri Dijital İmza Algoritması (ECDSA) kullanılarak oluşturulan bir sertifika gerekebilir.
HTTP/2 bağlantısı kuruluysa, HttpRequest.Protocol bildirir HTTP/2
.
.NET Core 3.0'dan başlayarak HTTP/2 varsayılan olarak etkindir. Yapılandırma hakkında daha fazla bilgi için seçenekler ve ListenOptions.Protocols bölümlerine bakınKestrel.
Ters ara sunucu ile ne zaman kullanılır Kestrel ?
Kestrel kendi başına veya ters ara sunucu ile kullanılabilir. Ters ara sunucu ağdan HTTP istekleri alır ve bunları adresine Kestreliletir. Ters ara sunucu örnekleri şunlardır:
Kestrel uç (İnternet'e yönelik) web sunucusu olarak kullanılır:
Kestrel 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.
- Ek bir yapılandırma katmanı ve derinlemesine savunma siber güvenlik sağlayın.
- Mevcut altyapıyla daha iyi tümleştirebilir.
- Yük dengeleme ve güvenli iletişim (HTTPS) yapılandırmasını basitleştirin. Yalnızca ters ara sunucu bir X.509 sertifikası gerektirir ve bu sunucu düz HTTP kullanarak uygulamanın iç ağdaki sunucularıyla iletişim kurabilir.
Uyarı
Ters ara sunucu yapılandırmasında barındırmak için İletilen Üst Bilgiler Ara Yazılım yapılandırması gerekir.
Kestrel ASP.NET Core uygulamalarında
ASP.NET Core proje şablonları varsayılan olarak kullanır Kestrel . içinde Program.cs
yöntemi şunu ConfigureWebHostDefaults çağırır UseKestrel:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Konağı oluşturma hakkında daha fazla bilgi için ASP.NET Core'da .NET Genel Konağı'nın Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine bakın.
çağrısı ConfigureWebHostDefaults
yaptıktan sonra ek yapılandırma sağlamak için kullanın ConfigureKestrel
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
// Set properties and call methods on options
})
.UseStartup<Startup>();
});
Kestrel Seçenekler
Web Kestrel sunucusu, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçeneklerine sahiptir.
Sınıfın Limits özelliğinde KestrelServerOptions kısıtlamalar ayarlayın. özelliği sınıfının Limits
bir örneğini barındırıyor KestrelServerLimits .
Aşağıdaki örneklerde ad alanı Microsoft.AspNetCore.Server.Kestrel.Core kullanılır:
using Microsoft.AspNetCore.Server.Kestrel.Core;
Bu makalenin devamında gösterilen örneklerde, Kestrel seçenekler C# kodunda yapılandırılır. Kestrel seçenekleri bir yapılandırma sağlayıcısı kullanılarak da ayarlanabilir. Örneğin, Dosya Yapılandırma Sağlayıcısı bir appsettings.json
veya appsettings.{Environment}.json
dosyasından yapılandırma yükleyebilirKestrel:
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
},
"DisableStringReuse": true
}
}
Not
KestrelServerOptions ve uç nokta yapılandırması, yapılandırma sağlayıcılarından yapılandırılabilir. Kalan Kestrel yapılandırma C# kodunda yapılandırılmalıdır.
Aşağıdaki yaklaşımlardan birini kullanın:
içinde
Startup.ConfigureServices
yapılandırınKestrel:sınıfına öğesinin bir örneğini
IConfiguration
Startup
ekleme. Aşağıdaki örnekte eklenen yapılandırmanın özelliğineConfiguration
atandığı varsayılır.içinde
Startup.ConfigureServices
, yapılandırmanınKestrel
bölümünü 'nin yapılandırmasına Kestrelyükleyin:using Microsoft.Extensions.Configuration public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.Configure<KestrelServerOptions>( Configuration.GetSection("Kestrel")); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... } }
Konağı oluştururken yapılandırma Kestrel :
içinde
Program.cs
, yapılandırmanınKestrel
bölümünü 'nin yapılandırmasına Kestrelyükleyin:// using Microsoft.Extensions.DependencyInjection; public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { services.Configure<KestrelServerOptions>( context.Configuration.GetSection("Kestrel")); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
Yukarıdaki yaklaşımların her ikisi de herhangi bir yapılandırma sağlayıcısıyla çalışır.
Etkin tutma zaman aşımı
Etkin tutma zaman aşımını alır veya ayarlar. Varsayılan değer 2 dakikadır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
En fazla istemci bağlantısı
MaxConcurrentConnections MaxConcurrentUpgradedConnections
Uygulamanın tamamı için en fazla eşzamanlı açık TCP bağlantısı sayısı aşağıdaki kodla ayarlanabilir:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
HTTP veya HTTPS'den başka bir protokole yükseltilen bağlantılar için ayrı bir sınır vardır (örneğin, bir WebSockets isteğinde). Bağlantı yükseltildikten sonra sınıra MaxConcurrentConnections
göre sayılmaz.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
Maksimum bağlantı sayısı varsayılan olarak sınırsızdır (null).
Maksimum istek gövdesi boyutu
Varsayılan maksimum istek gövdesi boyutu 30.000.000 bayttır ve bu da yaklaşık 28,6 MB'tır.
ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yaklaşım, özniteliğini bir eylem yönteminde RequestSizeLimitAttribute kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Her istekte uygulama kısıtlamasının nasıl yapılandırıldığını gösteren bir örnek aşağıda verilmişti:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
Ara yazılımda belirli bir istekte ayarı geçersiz kılın:
app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var minRequestRateFeature =
context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
var minResponseRateFeature =
context.Features.Get<IHttpMinResponseDataRateFeature>();
if (minRequestRateFeature != null)
{
minRequestRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
if (minResponseRateFeature != null)
{
minResponseRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
Uygulama isteği okumaya başladıktan sonra istekte sınırı yapılandırırsa bir özel durum oluşur. Özelliğin salt okunur durumda olup olmadığını MaxRequestBodySize
belirten bir IsReadOnly
özellik vardır; bu da sınırı yapılandırmak için çok geç olduğu anlamına gelir.
bir uygulama ASP.NET Çekirdek Modülü arkasında işlem dışı kaldığında, KestrelIIS sınırı zaten ayarladığı için istek gövdesi boyutu sınırı devre dışı bırakılır.
En düşük istek gövdesi veri hızı
MinRequestBodyDataRate MinResponseDataRate
Kestrel veriler belirtilen hızda bayt/saniye cinsinden geliyorsa her saniyeyi denetler. Hız minimum değerin altına düşerse bağlantı zaman aşımına uğradı. Yetkisiz kullanım süresi, istemcinin gönderme oranını en düşük değere kadar artırmasını sağlayan süredir Kestrel ; bu süre boyunca oran denetlenmiyor. Yetkisiz kullanım süresi, TCP yavaş başlatması nedeniyle başlangıçta yavaş hızda veri gönderen bağlantıların bırakılmasını önlemeye yardımcı olur.
Varsayılan en düşük hız, 5 saniye yetkisiz kullanım süresiyle 240 bayt/saniyedir.
Yanıt için en düşük oran da geçerlidir. İstek sınırını ve yanıt sınırını ayarlama kodu, özellik ve arabirim adlarına sahip veya Response
olması RequestBody
dışında aynıdır.
Aşağıda, içinde en düşük veri oranlarının nasıl yapılandırıldığını gösteren bir örnek verilmişti Program.cs
:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
Ara yazılımda istek başına en düşük hız sınırlarını geçersiz kılın:
app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var minRequestRateFeature =
context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
var minResponseRateFeature =
context.Features.Get<IHttpMinResponseDataRateFeature>();
if (minRequestRateFeature != null)
{
minRequestRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
if (minResponseRateFeature != null)
{
minResponseRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
IHttpMinResponseDataRateFeature Protokolün istek çoğullama desteği nedeniyle istek başına hız sınırlarının değiştirilmesi genellikle HTTP/2 için desteklenmediğinden, önceki örnekte başvuruda yer alan http/2 istekleri için mevcut HttpContext.Features
değildir. Bununla birlikte IHttpMinRequestBodyDataRateFeature HttpContext.Features
, okuma hızı sınırı bir HTTP/2 isteği için eşit olarak ayarlanarak IHttpMinRequestBodyDataRateFeature.MinDataRate
null
istek başına tamamen devre dışı bırakılabildiğinden, http/2 istekleri için hala mevcuttur. Okuma IHttpMinRequestBodyDataRateFeature.MinDataRate
girişiminde bulunulması veya değerinin dışında null
bir değere ayarlanması, http/2 isteği verilip atılmayla sonuçlanır NotSupportedException
.
aracılığıyla KestrelServerOptions.Limits
yapılandırılan sunucu genelinde hız sınırları, hem HTTP/1.x hem de HTTP/2 bağlantılarına uygulanır.
İstek üst bilgileri zaman aşımı
Sunucunun istek üst bilgilerini almak için harcadığı maksimum süreyi alır veya ayarlar. Varsayılan değer 30 saniyedir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
Bağlantı başına en fazla akış sayısı
Http2.MaxStreamsPerConnection
HTTP/2 bağlantısı başına eşzamanlı istek akışlarının sayısını sınırlar. Fazla akışlar reddedilir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Varsayılan değer 100 şeklindedir.
Üst bilgi tablosu boyutu
HPACK kod çözücüsü, HTTP/2 bağlantıları için HTTP üst bilgilerini açar. Http2.HeaderTableSize
HPACK kod çözücüsünün kullandığı üst bilgi sıkıştırma tablosunun boyutunu sınırlar. Değer sekizli olarak sağlanır ve sıfırdan (0) büyük olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Varsayılan değer 4096'dır.
Maksimum çerçeve boyutu
Http2.MaxFrameSize
sunucu tarafından alınan veya gönderilen HTTP/2 bağlantı çerçevesi yükünün izin verilen en büyük boyutunu gösterir. Değer sekizli olarak sağlanır ve 2^14 (16.384) ile 2^24-1 (16.777.215) arasında olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16384;
});
Varsayılan değer 2^14 'tür (16.384).
İstek üst bilgisi boyutu üst sınırı
Http2.MaxRequestHeaderFieldSize
, istek üst bilgisi değerlerinin sekizlisinde izin verilen en büyük boyutu gösterir. Bu sınır, sıkıştırılmış ve sıkıştırılmamış gösterimlerindeki hem ad hem de değer için geçerlidir. Değer sıfırdan (0) büyük olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
Varsayılan değer 8.192'dir.
İlk bağlantı penceresi boyutu
Http2.InitialConnectionWindowSize
sunucu arabelleklerinin bağlantı başına tüm istekler (akışlar) arasında bir kerede toplanmış en fazla istek gövdesi verilerini bayt cinsinden gösterir. İstekler ile de sınırlıdır Http2.InitialStreamWindowSize
. Değer 65.535'ten büyük veya buna eşit ve 2^31'den küçük olmalıdır (2.147.483.648).
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});
Varsayılan değer 128 KB'tır (131.072).
İlk akış penceresi boyutu
Http2.InitialStreamWindowSize
, sunucu tarafından istek başına bir kerede arabelleğe alınan en yüksek istek gövdesi verilerini bayt cinsinden gösterir (akış). İstekler ile de sınırlıdır Http2.InitialConnectionWindowSize
. Değer 65.535'ten büyük veya buna eşit ve 2^31'den küçük olmalıdır (2.147.483.648).
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});
Varsayılan değer 96 KB'tır (98.304).
Römork
HTTP Fragmanları HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilir. IIS ve HTTP.sys için yalnızca HTTP/2 yanıt fragmanları desteklenir.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Yukarıdaki örnek kodda:
SupportsTrailers
, römorkların yanıt için desteklendiğini güvence altına alır.DeclareTrailer
verilen römork adını yanıt üst bilgisineTrailer
ekler. Yanıtın fragmanlarının bildirilmesi isteğe bağlıdır ancak önerilir. çağrılırsaDeclareTrailer
, yanıt üst bilgileri gönderilmeden önce olmalıdır.AppendTrailer
römorku ekler.
Reset
Sıfırlama, sunucunun belirtilen hata koduyla bir HTTP/2 isteğini sıfırlamasına olanak tanır. Sıfırlama isteğinin durduruldu olarak kabul edilir.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
yukarıdaki kod örneğinde hata kodunu belirtir INTERNAL_ERROR
. HTTP/2 hata kodları hakkında daha fazla bilgi için HTTP/2 belirtimi hata kodu bölümünü ziyaret edin.
Zaman Uyumlu G/Ç
AllowSynchronousIO istek ve yanıt için zaman uyumlu G/Ç'ye izin verilip verilmeyeceğini denetler. Varsayılan değer şudur: false
.
Uyarı
Çok sayıda zaman uyumlu G/Ç işleminin engellenmesi iş parçacığı havuzu aç kalmasına neden olabilir ve bu da uygulamanın yanıt vermemesine neden olabilir. Yalnızca zaman uyumsuz G/Ç'yi desteklemeyen bir kitaplık kullanırken etkinleştirin AllowSynchronousIO
.
Aşağıdaki örnek zaman uyumlu G/Ç'yi etkinleştirir:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
})
Diğer Kestrel seçenekler ve sınırlar hakkında bilgi için bkz:
Uç nokta yapılandırması
Varsayılan olarak, ASP.NET Core şu şekilde bağlanır:
http://localhost:5000
https://localhost:5001
(yerel bir geliştirme sertifikası mevcut olduğunda)
URL'leri belirtmek için şunları kullanın:
ASPNETCORE_URLS
ortam değişkeni.--urls
komut satırı bağımsız değişkeni.urls
ana bilgisayar yapılandırma anahtarı.UseUrls
uzantı yöntemi.
Bu yaklaşımlar kullanılarak sağlanan değer bir veya daha fazla HTTP ve HTTPS uç noktası (varsayılan sertifika varsa HTTPS) olabilir. Değeri noktalı virgülle ayrılmış liste olarak yapılandırın (örneğin, "Urls": "http://localhost:8000;http://localhost:8001"
).
Bu yaklaşımlar hakkında daha fazla bilgi için bkz . Sunucu URL'leri ve Geçersiz kılma yapılandırması.
Geliştirme sertifikası oluşturulur:
- .NET Core SDK'sı 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.
için URL ön eklerini ve bağlantı noktalarını yapılandırmak için Kestrelçağrısı Listen KestrelServerOptions veya ListenUnixSocket yöntemleri açın.
UseUrls
--urls
, komut satırı bağımsız değişkeni, urls
konak yapılandırma anahtarı ve ASPNETCORE_URLS
ortam değişkeni de çalışır ancak bu bölümün ilerleyen bölümlerinde belirtilen sınırlamalara sahiptir (HTTPS uç noktası yapılandırması için varsayılan bir sertifika kullanılabilir olmalıdır).
KestrelServerOptions
konfigürasyon:
ConfigureEndpointDefaults(Eylem<DinleyicisiSeçenekler>)
Belirtilen her uç nokta için çalıştırılacak bir yapılandırma Action
belirtir. Birden çok kez çağrılması ConfigureEndpointDefaults
, öncekileri Action
belirtilen son Action
değerle değiştirir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Not
Çağrıdan ConfigureEndpointDefaults önce çağrılarak Listen oluş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ılması ConfigureHttpsDefaults
, öncekileri Action
belirtilen son Action
değerle değiştirir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Not
Çağrıdan ConfigureHttpsDefaults önce çağrılarak Listen oluşturulan uç noktalarda varsayılan değerler uygulanmaz.
Configure(IConfiguration)
Giriş olarak alan IConfiguration bir yapılandırma yükleyicisi oluştururKestrel. Yapılandırmanın kapsamı için Kestrelyapılandırma bölümü olarak belirlenmiş olmalıdır.
ListenOptions.UseHttps
HTTPS kullanmak için yapılandırın Kestrel .
ListenOptions.UseHttps
Uzantı -ları:
UseHttps
: HTTPS'yi varsayılan sertifikayla kullanacak şekilde yapılandırın Kestrel . Varsayılan sertifika yapılandırılmamışsa bir özel durum oluşturur.UseHttps(string fileName)
UseHttps(string fileName, string password)
UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)
UseHttps(StoreName storeName, string subject)
UseHttps(StoreName storeName, string subject, bool allowInvalid)
UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)
UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)
UseHttps(X509Certificate2 serverCertificate)
UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)
UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)
ListenOptions.UseHttps
Parametre:
filename
, uygulamanın içerik dosyalarını içeren dizine göre bir sertifika dosyasının yolu ve dosya adıdır.password
, X.509 sertifika verilerine erişmek için gereken paroladır.configureOptions
, öğesini yapılandırmak için birAction
'dirHttpsConnectionAdapterOptions
.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
Kestrelve https://localhost:5001
(http://localhost:5000
varsayılan bir sertifika varsa) dinler.
Varsayılan sertifikayı yapılandırmadan değiştirme
CreateDefaultBuilder
varsayılan olarak yapılandırmayı yüklemek Kestrel için çağırırConfigure(context.Configuration.GetSection("Kestrel"))
. için Kestrelvarsayılan BIR HTTPS uygulama ayarları yapılandırma şeması sağlanır. Disk üzerindeki bir dosyadan veya bir sertifika deposundan URL'ler ve kullanılacak sertifikalar dahil olmak üzere birden çok uç nokta yapılandırın.
Aşağıdaki appsettings.json
örnekte:
- Geçersiz sertifikaların (örneğin, otomatik olarak imzalanan sertifikalar) kullanılmasına izin vermek için AllowInvalid
true
olarak ayarlayın. - Sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte HttpsDefaultCert), Sertifika Varsayılanı> veya geliştirme sertifikası altında tanımlanan sertifikaya geri döner.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
},
"HttpsInlineCertStore": {
"Url": "https://localhost:5002",
"Certificate": {
"Subject": "<subject; required>",
"Store": "<certificate store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
},
"HttpsDefaultCert": {
"Url": "https://localhost:5003"
},
"Https": {
"Url": "https://*:5004",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
},
"Certificates": {
"Default": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
Herhangi bir sertifika düğümü için Yol ve Parola kullanmanın bir alternatifi, sertifika deposu alanlarını kullanarak sertifikayı belirtmektir. Örneğin, Sertifikalar>Varsayılan sertifikası şu şekilde belirtilebilir:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Şema notları:
- Uç nokta adları büyük/küçük harfe duyarlı değildir. Örneğin ve
HTTPS
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üzeyUrls
yapılandırma parametresiyle aynıdır.- Bu uç noktalar, bunlara eklemek yerine üst düzey
Urls
yapılandırmada tanımlananların yerini alır. aracılığıylaListen
kodda tanımlanan uç noktalar, yapılandırma bölümünde tanımlanan uç noktalarla birikmeli olarak bulunur. - Bölüm
Certificate
isteğe bağlıdır.Certificate
Bölüm belirtilmezse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Kullanılabilir varsayılan ayar yoksa, sunucu bir özel durum oluşturur ve başlatılamaz. Certificate
bölümü hem Yol–Parola hem de Konu-Depolama sertifikalarını destekler.- Bağlantı noktası çakışmalarına neden olmayan herhangi bir sayıda uç nokta bu şekilde tanımlanabilir.
options.Configure(context.Configuration.GetSection("{SECTION}"))
KestrelConfigurationLoader
, yapılandırılmış bir.Endpoint(string name, listenOptions => { })
uç noktanın ayarlarını desteklemek için kullanılabilecek bir yöntemle döndürür:
webBuilder.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader
, tarafından CreateDefaultBuildersağlanan gibi mevcut yükleyicide yinelemeye devam etmek için doğrudan erişilebilir.
- Her uç noktanın yapılandırma bölümü, özel ayarların okunabilmesi için yöntemindeki
Endpoint
seçeneklerde kullanılabilir. - Başka bir bölümle yeniden çağrılarak
options.Configure(context.Configuration.GetSection("{SECTION}"))
birden çok yapılandırma yüklenebilir. Önceki örneklerde açıkça çağrılmadığı süreceLoad
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
Listen
, APIKestrelServerOptions
ailesini aşırı yükleme olarakEndpoint
yansıtır, bu nedenle kod ve yapılandırma uç noktaları aynı yerde yapılandırılabilir. Bu aşırı yüklemeler adları kullanmaz ve yalnızca yapılandırmadan varsayılan ayarları kullanır.
Koddaki varsayılanları değiştirme
ConfigureEndpointDefaults
ve ConfigureHttpsDefaults
, önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma dahil olmak üzere ve için varsayılan ayarları değiştirmek için ListenOptions
HttpsConnectionAdapterOptions
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 geri çağırma yoluyla SNI'yi ServerCertificateSelector
destekler. Uygulamanın konak adını incelemesine ve uygun sertifikayı seçmesine izin vermek için bağlantı başına bir kez geri arama çağrılır.
SNI desteği şunları gerektirir:
- Hedef çerçevede
netcoreapp2.1
veya sonraki sürümlerde çalışıyor. Veya daha sonraki bir tarihtenet461
geri arama çağrılır, ancakname
her zamannull
olur.name
ayrıcanull
, istemci TLS el sıkışmasında ana bilgisayar adı parametresini sağlamazsa da olur. - Tüm web siteleri aynı Kestrel örnekte çalışır. Kestrel ip adresini ve bağlantı noktasını ters ara sunucu olmadan birden çok örnek arasında paylaşmayı desteklemez.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var subExampleCert = CertificateLoader.LoadFromStoreCert(
"sub.example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var certs = new Dictionary<string, X509Certificate2>(
StringComparer.OrdinalIgnoreCase);
certs["localhost"] = localhostCert;
certs["example.com"] = exampleCert;
certs["sub.example.com"] = subExampleCert;
httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
{
if (name != null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
});
Bağlantı günlüğü
Bağlantıda bayt düzeyi iletişim için Hata ayıklama düzeyi günlükleri yaymak için çağrısı UseConnectionLogging yapın. Bağ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. önüne UseHttps
yerleştirilirse UseConnectionLogging
şifrelenmiş trafik günlüğe kaydedilir. sonra yerleştirilirse UseConnectionLogging
UseHttps
, şifresi çözülen trafik günlüğe kaydedilir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
TCP yuvasına bağlama
Listen yöntemi bir TCP yuvasına bağlanır ve lambda seçenekleri X.509 sertifika yapılandırmasına izin verir:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
})
.UseStartup<Startup>();
});
Örnek, ile ListenOptionsbir uç nokta için HTTPS'yi yapılandırıyor. Belirli uç noktaların diğer Kestrel ayarlarını yapılandırmak için aynı API'yi kullanın.
Windows'da otomatik olarak imzalanan sertifikalar PowerShell cmdlet'i New-SelfSignedCertificate
kullanılarak oluşturulabilir. Desteklenmeyen bir örnek için bkz UpdateIISExpressSSLForChrome.ps1
. .
macOS, Linux ve Windows'da sertifikalar OpenSSL kullanılarak oluşturulabilir.
Unix yuvasına bağlama
Bu örnekte gösterildiği gibi Nginx ile geliştirilmiş performans için ile unix yuvasını ListenUnixSocket dinleyin:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock",
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testpassword");
});
})
- Nginx yapılandırma dosyasında girdisini
server
>proxy_pass
>location
olarakhttp://unix:/tmp/{KESTREL SOCKET}:/;
ayarlayın.{KESTREL SOCKET}
, verilen ListenUnixSocket yuvanın adıdır (örneğin,kestrel-test.sock
önceki örnekte). - Yuvanın Nginx tarafından yazılabilir olduğundan emin olun (örneğin,
chmod go+w /tmp/kestrel-test.sock
).
Bağlantı noktası 0
Bağlantı noktası numarası 0
belirtildiğinde, Kestrel kullanılabilir bir bağlantı noktasına dinamik olarak bağlanır. Aşağıdaki örnekte çalışma zamanında hangi bağlantı noktasının Kestrel bağlandığının nasıl belirlendiği gösterilmektedir:
public void Configure(IApplicationBuilder app)
{
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
app.UseStaticFiles();
app.Run(async (context) =>
{
context.Response.ContentType = "text/html";
await context.Response
.WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
"<title></title></head><body><p>Hosted by Kestrel</p>");
if (serverAddressesFeature != null)
{
await context.Response
.WriteAsync("<p>Listening on the following addresses: " +
string.Join(", ", serverAddressesFeature.Addresses) +
"</p>");
}
await context.Response.WriteAsync("<p>Request URL: " +
$"{context.Request.GetDisplayUrl()}<p>");
});
}
Uygulama çalıştırıldığında konsol penceresi çıkışı, uygulamaya ulaşabileceğiniz dinamik bağlantı noktasını gösterir:
Listening on the following addresses: http://127.0.0.1:48508
Sınırlamalar
Uç noktaları aşağıdaki yaklaşımlarla yapılandırın:
- UseUrls
--urls
komut satırı bağımsız değişkeniurls
konak yapılandırma anahtarıASPNETCORE_URLS
ortam değişkeni
Bu yöntemler, dışındaki Kestrelsunucularla kod çalışması için kullanışlıdır. Ancak aşağıdaki sınırlamalara dikkat edin:
- HTTPS uç noktası yapılandırmasında varsayılan bir sertifika sağlanmadığı sürece (örneğin, bu konuda daha önce gösterildiği gibi yapılandırma veya yapılandırma dosyası kullanma
KestrelServerOptions
) HTTPS bu yaklaşımlarla kullanılamaz. - Hem hem de
Listen
yaklaşımları aynı anda kullanıldığında,Listen
uç noktalar uç noktaları geçersiz kılarUseUrls
.UseUrls
IIS uç noktası yapılandırması
IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya UseUrls
tarafından Listen
ayarlanır. Daha fazla bilgi için ASP.NET Temel Modülü konusuna bakın.
ListenOptions.Protocols
özelliği, Protocols
bir bağlantı uç noktasında veya sunucu için etkinleştirilen HTTP protokollerini (HttpProtocols
) oluşturur. Enum'dan özelliğine Protocols
bir değer atayın HttpProtocols
.
HttpProtocols sabit listesi değeri |
Bağ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 anlaşma devre dışı bırakıldı
- Sıkıştırma devre dışı bırakıldı
- Minimum kısa ömürlü anahtar değişimi boyutları:
- Eliptik eğri Diffie-Hellman (ECDHE) [RFC4492]: en az 224 bit
- Sonlu alan Diffie-Hellman (DHE) [
TLS12
]: 2048 bit minimum
- Şifre paketi yasak değildir.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
[TLS-ECDHE
] ile P-256 üç nokta eğrisi [FIPS186
] varsayılan olarak desteklenir.
Aşağıdaki örnek, 8000 numaralı bağlantı noktasında HTTP/1.1 ve HTTP/2 bağlantılarına izin verir. Bağ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 şifreleme algoritması için oluşturur NotSupportedException . Alternatif olarak, ITlsHandshakeFeature.CipherAlgorithm öğesini tanımlayıp kabul edilebilir şifreleme paketlerinin listesiyle karşılaştırın.
CipherAlgorithmType.Null şifreleme algoritması ile şifreleme kullanılmaz.
// using System.Net;
// using Microsoft.AspNetCore.Connections;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.UseTlsFilter();
});
});
using System;
using System.Security.Authentication;
using Microsoft.AspNetCore.Connections.Features;
namespace Microsoft.AspNetCore.Connections
{
public static class TlsFilterConnectionMiddlewareExtensions
{
public static IConnectionBuilder UseTlsFilter(
this IConnectionBuilder builder)
{
return builder.Use((connection, next) =>
{
var tlsFeature = connection.Features.Get<ITlsHandshakeFeature>();
if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
{
throw new NotSupportedException("Prohibited cipher: " +
tlsFeature.CipherAlgorithm);
}
return next();
});
}
}
}
Bağ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 yapılandırmayı yüklemek Kestrel için çağırırserverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.
Aşağıdaki appsettings.json
örnek, tüm uç noktalar için varsayılan bağlantı protokolü olarak HTTP/1.1'i oluşturur:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
Aşağıdaki appsettings.json
örnekte, belirli bir uç nokta için HTTP/1.1 bağlantı protokolü oluşturulur:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Yapılandırmaya göre ayarlanan kod geçersiz kılma değerlerinde belirtilen protokoller.
URL ön ekleri
UseUrls
kullanırken, --urls
komut satırı bağımsız değişkeni, urls
konak yapılandırma anahtarı veya ASPNETCORE_URLS
ortam değişkeni, URL ön ekleri aşağıdaki biçimlerden herhangi birinde olabilir.
Yalnızca HTTP URL ön ekleri geçerlidir. Kestrel kullanarak UseUrls
URL bağlamalarını yapılandırırken HTTPS'yi desteklemez.
Bağlantı noktası numarası olan IPv4 adresi
http://65.55.39.10:80/
0.0.0.0
, tüm IPv4 adreslerine bağlanan özel bir durumdur.Bağlantı noktası numarasıyla IPv6 adresi
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
, IPv4'ün0.0.0.0
IPv6 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 veyalocalhost
tüm IPv4 ve IPv6 IP'lerine bağlanan her şey. Farklı konak adlarını aynı bağlantı noktasındaki farklı ASP.NET Core uygulamalarına bağlamak için HTTP.sys veya IIS, Nginx veya Apache gibi bir ters ara sunucu kullanın.Uyarı
Ters ara sunucu yapılandırmasında barındırmak için İletilen Üst Bilgiler Ara Yazılım yapılandırması gerekir.
Bağlantı noktası numarası veya bağlantı noktası numarası ile geri döngü IP'siyle ana
localhost
bilgisayar adıhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Belirtildiğinde
localhost
, Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerine bağlanmaya çalışır. İstenen bağlantı noktası herhangi bir geri döngü arabiriminde başka bir hizmet tarafından kullanılıyorsa başlatılamaz Kestrel . Geri döngü arabirimi herhangi bir nedenle kullanılamıyorsa (en yaygın olarak IPv6 desteklenmediğinden), Kestrel bir uyarı günlüğe kaydeder.
Konak filtreleme
gibi http://example.com:5000
Kestrel ön ekleri temel alan yapılandırmayı desteklese deKestrel, konak adını büyük ölçüde yoksayar. Konak localhost
, geri döngü adreslerine bağlama için kullanılan özel bir durumdur. Açık IP adresi dışındaki tüm konaklar tüm genel IP adreslerine bağlanır. Host
üst bilgiler doğrulanmaz.
Geçici bir çözüm olarak Konak Filtreleme Ara Yazılımını kullanın. Konak Filtreleme Ara Yazılımı, ASP.NET Core uygulamaları için örtük olarak sağlanan Microsoft.AspNetCore.HostFiltering paketi tarafından sağlanır. Ara yazılım tarafından CreateDefaultBuildereklenir ve öğesini çağırır AddHostFiltering:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Konak Filtreleme Ara Yazılımı varsayılan olarak devre dışıdır. Ara yazılımı etkinleştirmek için içinde appsettings.json
/appsettings.{Environment}.json
bir AllowedHosts
anahtar tanımlayın. Değer, bağlantı noktası numaraları olmayan konak adlarının noktalı virgülle ayrılmış listesidir:
appsettings.json
:
{
"AllowedHosts": "example.com;localhost"
}
Not
İletilen Üst Bilgiler Ara Yazılımının da bir AllowedHosts seçeneği vardır. İletilen Üst Bilgiler Ara Yazılımı ve Konak Filtreleme Ara Yazılımı, farklı senaryolar için benzer işlevlere sahiptir. AllowedHosts
İletilen Üst Bilgiler Ara Yazılımı ayarı, istekleri ters ara sunucu veya yük dengeleyici ile iletirken üst bilgi korunmadığında Host
uygundur. Genel kullanıma yönelik bir kenar sunucusu olarak kullanıldığında veya üst bilgi doğrudan iletildiğinde Host
Konak Filtreleme Ara Yazılımı ile ayarlama AllowedHosts
uygundurKestrel.
İletilen Üst Bilgiler Ara Yazılımı hakkında daha fazla bilgi için bkz . ASP.NET Çekirdeği ara sunucularla ve yük dengeleyicilerle çalışacak şekilde yapılandırma.
Libuv aktarım yapılandırması
LibuvUseLibuv () kullanımını gerektiren projeler için:
Uygulamanın proje dosyasına paket için
Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv
bir bağımlılık ekleyin:<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="{VERSION}" />
üzerinde çağrısıUseLibuv:
IWebHostBuilder
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseLibuv(); webBuilder.UseStartup<Startup>(); }); }
HTTP/1.1 isteği boşaltma
HTTP bağlantılarını açmak zaman alır. HTTPS için de yoğun kaynak kullanır. Bu nedenle, Kestrel HTTP/1.1 protokolü başına bağlantıları yeniden oluşturmaya çalışır. Bağlantının yeniden kullanılmasına izin vermek için bir istek gövdesinin tamamen kullanılması gerekir. Uygulama, sunucunun yeniden yönlendirme veya 404 yanıtı döndürdüğü istekler gibi POST
istek gövdesini her zaman kullanmaz. POST
-redirect durumunda:
- İstemci verilerin bir bölümünü
POST
zaten göndermiş olabilir. - Sunucu 301 yanıtını yazar.
- Önceki istek gövdesindeki
POST
veriler tamamen okunana kadar bağlantı yeni bir istek için kullanılamaz. - Kestrel istek gövdesini boşaltmaya çalışır. İstek gövdesinin boşaltılması, verileri işlemeden okuma ve atma anlamına gelir.
Boşaltma işlemi, bağlantının yeniden kullanılmasına izin verme ile kalan verilerin boşaltılması için gereken süre arasında bir denge sağlar:
- Boşaltma beş saniyelik bir zaman aşımına sahiptir ve bu da yapılandırılamaz.
- veya
Transfer-Encoding
üst bilgisi tarafındanContent-Length
belirtilen tüm veriler zaman aşımından önce okunmamışsa, bağlantı kapatılır.
Bazen yanıtı yazmadan önce veya yazdıktan sonra isteği hemen sonlandırmak isteyebilirsiniz. Örneğin, istemcilerin kısıtlayıcı veri üst sınırları olabilir, bu nedenle karşıya yüklenen verilerin sınırlanması öncelikli olabilir. Bu gibi durumlarda bir isteği sonlandırmak için bir denetleyiciden, Razor Sayfadan veya ara yazılımdan HttpContext.Abort'u çağırın.
çağrılması Abort
gereken uyarılar vardır:
- Yeni bağlantılar oluşturmak yavaş ve pahalı olabilir.
- bağlantı kapanmadan önce istemcinin yanıtı okuduğunun garantisi yoktur.
- Çağrı
Abort
nadir olmalı ve sık karşılaşılan hatalar için değil, ciddi hata durumları için ayrılmalıdır.- Yalnızca belirli bir sorunun çözülmesi gerektiğinde arayın
Abort
. Örneğin, kötü amaçlı istemciler verileri deniyorsaPOST
veya istemci kodunda büyük veya çok sayıda isteğe neden olan bir hata varsa çağrısındaAbort
bulunarak. - 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 istek gövdesi veri çerçeveleri yoksayılır.
Mümkünse, istemcilerin Expect: 100-continue istek üst bilgisini kullanmaları ve istek gövdesini göndermeye başlamadan önce sunucunun yanıt vermesini beklemeleri daha iyidir. Bu, istemciye gereksiz verileri göndermeden önce yanıtı inceleme ve durdurma fırsatı verir.
Ek kaynaklar
- 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