KestrelASP.NET Core'de web sunucusu uygulaması
Tom Dykstra, Chris Chris Chrisve Stephen Halter tarafından
Kestrel, için platformlar arası bir web ASP.NET Core. Kestrel, proje şablonlarına dahil edilen ve varsayılan olarak etkin ASP.NET Core sunucusudur.
Kestrel aşağıdaki senaryoları destekler:
- HTTPS
- HTTP/2 (macOS † hariç)
- WebSockets'i etkinleştirmek için kullanılan opak yükseltme
- Nginx'in arkasında yüksek performans için Unix yuvaları
†HTTP/2, gelecek bir sürümde macOS'ta desteklenecegizli olacak.
Kestrel , .NET Core'un desteklediği tüm platformlarda ve sürümlerde de desteklemektedir.
Örnek kodu görüntüleme veya indirme ( nasılindir)
başlarken
ASP.NET Core proje şablonları varsayılan Kestrel olarak kullanılır. Program.cs içinde yöntemi ConfigureWebHostDefaults çağrısında UseKestrel bulundu:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Konak oluşturma hakkında daha fazla bilgi için, 'nin Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine ASP.NET Core .NET genel ana bilgisayarı bakın.
İsteğe bağlı istemci sertifikaları
Uygulamanın bir alt kümesini bir sertifika ile korumanız gereken uygulamalar hakkında bilgi için bkz. İsteğe bağlı istemci sertifikaları.
Ek kaynaklar
- Web sunucusu için ASP.NET Core Kestrel yapılandırma
- Web sunucusu için ASP.NET Core Kestrel yapılandırma
- Web sunucusuyla HTTP/2 ASP.NET Core Kestrel kullanma
- Web sunucusu ile ters ara sunucu ASP.NET Core Kestrel kullanılır
- ASP.NET Core Kestrel web sunucusuyla konak filtrelemesi
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core 'de HTTPS 'yi zorla
- Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma
- RFC 7230: İleti Söz Dizimi ve Yönlendirme (Bölüm 5.4: Konak)
- Linux'UNIX yuvaları kullanırken yuva, uygulama kapatılırken otomatik olarak silinmez. Daha fazla bilgi için bu soruna GitHub bakın.
Not
5 ASP.NET Core 5.0'dan sonra Kestrel libuv taşıması artık kullanılmıyor. Libuv taşıması, Windows ARM64 gibi yeni işletim sistemi platformlarını desteklemek için güncelleştirmeler almaz ve gelecek bir sürümde kaldırılacaktır. Eski yönteme yapılan çağrıları UseLibuv kaldırın ve bunun yerine Kestrel 'nin varsayılan Yuva taşıması kullanın.
Kestrel, için platformlar arası bir web ASP.NET Core. Kestrel, proje şablonlarına varsayılan olarak dahil ASP.NET Core sunucusudur.
Kestrel aşağıdaki senaryoları destekler:
- HTTPS
- WebSockets'i etkinleştirmek için kullanılan opak yükseltme
- Nginx'in arkasında yüksek performans için Unix yuvaları
- HTTP/2 (macOS † hariç)
†HTTP/2, gelecek bir sürümde macOS'ta desteklenecegizli olacak.
Kestrel , .NET Core'un desteklediği tüm platformlarda ve sürümlerde de desteklemektedir.
Örnek kodu görüntüleme veya indirme ( nasılindir)
HTTP/2 desteği
Http/2, aşağıdaki ASP.NET Core karşılarsa bu uygulamalar için kullanılabilir:
- İşletim sistemi†
- Windows Server 2016/Windows 10 veya sonraki bir‡
- OpenSSL 1.0.2 veya sonraki sürümleriyle Linux (örneğin Ubuntu 16.04 veya sonraki bir sürümü)
- Hedef çerçeve: .NET Core 2.2 veya sonraki bir
- Uygulama Katmanı Protokol Anlaşması (KATMANıN) bağlantısı
- TLS 1.2 veya sonraki bir bağlantı
†HTTP/2, gelecek bir sürümde macOS'ta desteklenecegizli olacak. ‡Kestrel, R2 ve Windows Server 2012 üzerinde HTTP/2 için sınırlı Windows 8.1. Bu işletim sistemlerinde kullanılabilen desteklenen TLS şifreleme paketlerinin listesi sınırlı olduğundan destek sınırlıdır. TLS bağlantılarının güvenliğini sağlamak için Eliptik Eğri Dijital İmza Algoritması (ECDSA) kullanılarak oluşturulan bir sertifika gerekebilir.
Bir HTTP/2 bağlantısı kurulursa, HttpRequest.Protocol HTTP/2 raporları.
.NET Core 3.0'dan başlayarak HTTP/2 varsayılan olarak etkindir. Yapılandırma hakkında daha fazla bilgi için Kestrel seçenekler ve ListenOptions.Protocols bölümlerine bakın.
Ters ara sunucu Kestrel ile ne zaman kullanmalı?
Kestreltek başına veya Internet Information Services (IIS) , Nginxveya Apache gibi bir ters ara sunucu ile kullanılabilir. Ters ara sunucu, ağdan HTTP isteklerini alır ve bu istekleri adresine Kestrel iletir.
Kestrel uç (İnternet'e yönelik) web sunucusu olarak kullanılır:

Kestrel ters ara sunucu 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ılır, aynı IP ve bağlantı noktasının birden çok işlem arasında paylaşımını desteklemez. Bir bağlantı noktasını dinleyecek şekilde yapılandırıldığında, isteklerin üst bilgilerden bağımsız olarak bu Kestrel bağlantı noktası için tüm trafiği Kestrel Host işler. Bağlantı noktalarını paylaştıran bir ters ara sunucu, istekleri benzersiz bir IP ve Kestrel bağlantı noktası üzerinde adresine iletebilir.
Ters ara sunucu gerekli değilse bile, ters ara sunucu kullanmak iyi bir seçenek olabilir.
Ters ara sunucu:
- Barındır olduğu uygulamaların açık genel yüzey alanı sınırlayıcı olabilir.
- Ek bir yapılandırma ve savunma katmanı sağlama.
- Var olan altyapıyla daha iyi tümleştiri olabilir.
- Yük dengelemeyi ve güvenli iletişim (HTTPS) yapılandırmasını basitleştirin. Yalnızca ters ara sunucu bir X.509 sertifikası gerektirir ve bu sunucu, düz HTTP kullanarak iç ağ üzerinde uygulamanın sunucularıyla iletişim kurabilir.
Uyarı
Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.
KestrelASP.NET Core uygulamalarda
ASP.NET Core proje şablonları varsayılan Kestrel olarak kullanılır. Program.cs içinde yöntemi ConfigureWebHostDefaults çağrısında UseKestrel bulundu:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Konak oluşturma hakkında daha fazla bilgi için, 'nin Konak ayarlama ve Varsayılan oluşturucu ayarları bölümlerine ASP.NET Core .NET genel ana bilgisayarı bakın.
çağrısı sonrasında ek yapılandırma sağlamak için ConfigureWebHostDefaults ConfigureKestrel kullanın:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
// Set properties and call methods on options
})
.UseStartup<Startup>();
});
Kestrel Seçenekler
Web Kestrel sunucusunun, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçenekleri vardır.
sınıfının özelliği Limits üzerinde kısıtlamalar KestrelServerOptions ayarlayın. Limitsözelliği sınıfının bir örneğini KestrelServerLimits tutar.
Aşağıdaki örneklerde ad alanı Microsoft.AspNetCore.Server.Kestrel.Core kullanılır:
using Microsoft.AspNetCore.Server.Kestrel.Core;
Bu makalenin devamlarında gösterilen Kestrel örneklerde seçenekler C# kodunda yapılandırılır. Kestrelseçenekleri bir yapılandırma sağlayıcısı kullanılarak da ayarlandırabilirsiniz. Örneğin, Dosya Yapılandırma Sağlayıcısı bir veya Kestrel appsettings.json appsettings'den yapılandırmayı yükleyemedi.{ Environment}.json dosyası:
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
},
"DisableStringReuse": true
}
}
Not
KestrelServerOptions ve uç nokta yapılandırması yapılandırma sağlayıcılarından yapılandırılabilir. Kalan Kestrel yapılandırmanın C# kodunda yapılandırılması gerekir.
Aşağıdaki yaklaşımlardan birini kullanın:
içinde Kestrel
Startup.ConfigureServicesyapılandırma:sınıfına bir
IConfigurationörneğiStartupekleme. Aşağıdaki örnekte, özelliğine yeni yapılandırmanın atandığıConfigurationvarsayıldı.içinde,
Startup.ConfigureServicesyapılandırmaKestrelbölümünü Kestrel 'nin yapılandırmasına yükleme:using Microsoft.Extensions.Configuration public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.Configure<KestrelServerOptions>( Configuration.GetSection("Kestrel")); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... } }
Konak Kestrel yapılandırılırken yapılandırma:
Program.cs içinde, yapılandırma
Kestrelbölümünü Kestrel 'nin yapılandırmasına yükleme:// using Microsoft.Extensions.DependencyInjection; public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { services.Configure<KestrelServerOptions>( context.Configuration.GetSection("Kestrel")); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
Yukarıdaki yaklaşımların her ikisi de herhangi bir yapılandırma sağlayıcısı ile çalışır.
Canlı tutma zaman aşımı
Keep-alive zaman aşımını alır veya ayarlar. Varsayılan değer 2 dakikadır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
En fazla istemci bağlantısı
MaxConcurrentConnections MaxConcurrentUpgradedConnections
Uygulamanın tamamı için en fazla eş zamanlı açık TCP bağlantısı sayısı aşağıdaki kodla ayarlanabilir:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
HTTP veya HTTPS'den başka bir protokole (örneğin, Bir WebSockets isteği üzerinde) yükseltilen bağlantılar için ayrı bir sınır vardır. Bir bağlantı yükseltildikten sonra, bu sınıra göre sayılmaz MaxConcurrentConnections .
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
En fazla bağlantı sayısı, varsayılan olarak sınırsız (null).
En büyük istek gövdesi boyutu
Varsayılan en büyük istek gövdesi boyutu 30.000.000 bayttır ve bu değer yaklaşık 28,6 MB 'tır.
ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yaklaşım, RequestSizeLimitAttribute bir eylem yönteminde özniteliğini kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Her istekte uygulama için kısıtlamanın nasıl yapılandırılacağını gösteren bir örnek aşağıda verilmiştir:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
Ara yazılım içindeki belirli bir istek üzerindeki ayarı geçersiz kılın:
app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var minRequestRateFeature =
context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
var minResponseRateFeature =
context.Features.Get<IHttpMinResponseDataRateFeature>();
if (minRequestRateFeature != null)
{
minRequestRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
if (minResponseRateFeature != null)
{
minResponseRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
Uygulama isteği okumaya başladıktan sonra bir istek üzerindeki sınırı yapılandırırsa, bir özel durum oluşturulur. IsReadOnlyÖzelliğin salt okuma durumunda olup olmadığını belirten bir özellik vardır. Bu, MaxRequestBodySize sınırı yapılandırmanın çok geç olduğunu gösterir.
bir uygulama ASP.NET Core modülününarkasında çalıştırıldığında , Kestrel ııs sınırı zaten ayarladığı için istek gövdesi boyut sınırı devre dışı bırakılır.
En az istek gövdesi veri hızı
MinRequestBodyDataRate MinResponseDataRate
Kestrel veriler belirtilen hızda bayt/saniye olarak ulaşan her saniye bir denetler. Oran en düşük değerin altına düşerse bağlantı zaman aşımına uğrar. Yetkisiz kullanım süresi, Kestrel istemcinin gönderme hızını en düşüye artırması için gereken süredir. bu süre boyunca fiyat denetlenmez. Yetkisiz kullanım süresi, TCP yavaş başlatma nedeniyle başlangıçta verileri yavaş bir hızda gönderen bağlantıların bırakılmasını önlemeye yardımcı olur.
Varsayılan en düşük oran, 5 saniyelik bir yetkisiz kullanım süresi ile 240 bayt/saniye olur.
Yanıt için bir minimum oran da geçerlidir. İstek sınırını ayarlamaya yönelik kod ve yanıt sınırı, RequestBody Response özellik ve arabirim adlarında olduğu gibi aynı olur.
İşte, program. cs' de en düşük veri hızlarının nasıl yapılandırılacağını gösteren bir örnek:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
Ara yazılım içindeki istek başına düşen minimum hız sınırlarını geçersiz kılın:
app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var minRequestRateFeature =
context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
var minResponseRateFeature =
context.Features.Get<IHttpMinResponseDataRateFeature>();
if (minRequestRateFeature != null)
{
minRequestRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
if (minResponseRateFeature != null)
{
minResponseRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
IHttpMinResponseDataRateFeatureÖnceki örnekte başvurulan, HttpContext.Features http/2 isteklerinde hız sınırlarını değiştirmek, protokolün istek çoğullama DESTEĞI nedeniyle http/2 için genel olarak desteklenmediği IÇIN, http/2 istekleri için ' de mevcut değildir. Ancak, http IHttpMinRequestBodyDataRateFeature HttpContext.Features /2 istekleri için yine de vardır, çünkü okuma hızı sınırı, IHttpMinRequestBodyDataRateFeature.MinDataRate null bir http/2 isteği için de olarak ayarlanarak tamamen istek temelli olarak devre dışı bırakılabilir. IHttpMinRequestBodyDataRateFeature.MinDataRateBunun dışında bir değere ayarlamaya çalışılması veya BIR null NotSupportedException http/2 isteği verilmeye neden olur.
KestrelServerOptions.LimitsHttp/1. x ve http/2 bağlantılarına hala uygulanan sunucu genelindeki hız sınırları.
İstek üst bilgileri zaman aşımı
Sunucunun istek üst bilgilerini alması için harcadığı en uzun süreyi alır veya ayarlar. Varsayılan değer 30 saniyedir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100,
gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
serverOptions.Limits.KeepAliveTimeout =
TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout =
TimeSpan.FromMinutes(1);
})
Bağlantı başına en fazla akış
Http2.MaxStreamsPerConnection HTTP/2 bağlantısı başına eşzamanlı istek akışı sayısını sınırlar. Fazlalık akışlar reddedildi.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Varsayılan değer 100’dür.
Üst bilgi tablosu boyutu
HPACK kod çözücüsü HTTP/2 bağlantıları için HTTP üstbilgilerini açar. Http2.HeaderTableSize HPACK kod çözücüsünün kullandığı üst bilgi sıkıştırma tablosunun boyutunu sınırlandırır. Değer sekizli cinsinden sağlanır ve sıfırdan büyük olmalıdır (0).
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Varsayılan değer 4096 ' dir.
En büyük çerçeve boyutu
Http2.MaxFrameSize sunucu tarafından alınan veya gönderilen HTTP/2 bağlantı çerçevesi yükünün izin verilen en büyük boyutunu belirtir. Değer sekizli cinsinden sağlanır ve 2 ^ 14 (16.384) ile 2 ^ 24-1 (16.777.215) arasında olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16384;
});
Varsayılan değer 2 ^ 14 ' dir (16.384).
En fazla istek üst bilgi boyutu
Http2.MaxRequestHeaderFieldSize istek üst bilgisi değerlerinin sekizlisi cinsinden izin verilen en büyük boyutu belirtir. Bu sınır, sıkıştırılmış ve sıkıştırılmamış temsillerinde hem ad hem de değer için geçerlidir. Değer sıfırdan büyük (0) olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
Varsayılan değer 8.192 ' dir.
İlk bağlantı pencere boyutu
Http2.InitialConnectionWindowSize sunucu, bağlantı başına tüm istekler (akışlar) genelinde toplanan tek seferde sunucunun arabelleğe aldığı en fazla istek gövde verilerini bayt cinsinden gösterir. İstekleri ile de sınırlıdır Http2.InitialStreamWindowSize . Değer, 65.535 değerinden büyük veya buna eşit ve 2 ^ 31 (2.147.483.648) değerinden küçük olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});
Varsayılan değer 128 KB 'tır (131.072).
İlk akış pencere boyutu
Http2.InitialStreamWindowSize sunucu, istek başına bir kez (Stream) arabelleğe alınan en fazla istek gövde verilerini bayt cinsinden gösterir. İstekleri ile de sınırlıdır Http2.InitialConnectionWindowSize . Değer, 65.535 değerinden büyük veya buna eşit ve 2 ^ 31 (2.147.483.648) değerinden küçük olmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});
Varsayılan değer 96 KB 'tır (98.304).
Larına
HTTP Trailer'lar HTTP Üst Bilgilerine benzer, ancak yanıt gövdesi gönderildikten sonra gönderilirler. IIS ve HTTP.sys, yalnızca HTTP/2 yanıt tanıtımları de destekler.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Yukarıdaki örnek kodda:
SupportsTrailers, yanıt için tanıtımların desteklenesini sağlar.DeclareTrailerverilen tanıtım adını yanıt üstTrailerbilgisinde ekler. Yanıtın tanıtımları bildirilse de isteğe bağlıdır, ancak önerilir.DeclareTrailerçağrılırsa, yanıt üst bilgileri gönderilmeden önce olması gerekir.AppendTrailer, tanıtıma ekler.
Sıfırla
Sıfırlama, sunucunun belirtilen bir hata kodu ile HTTP/2 isteğini sıfırlamasına izin verir. Bir sıfırlama isteği durdurulan kabul edilir.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset Yukarıdaki kod örneğinde INTERNAL_ERROR hata kodu belirtilir. HTTP/2 hata kodları hakkında daha fazla bilgi için http/2 belirtim hata kodu bölümünüziyaret edin.
Zaman Uyumlu G/Ç
AllowSynchronousIO istek ve yanıt için zaman uyumlu g/ç 'ye izin verilip verilmediğini denetler. false varsayılan değerdir.
Uyarı
Çok sayıda engelleme zaman uyumlu g/ç işlemi, iş parçacığı havuzuna yol açabilir, bu da uygulamanın yanıt vermemesine neden olur. Yalnızca AllowSynchronousIO zaman uyumsuz g/ç desteklemeyen bir kitaplık kullanırken etkinleştirin.
Aşağıdaki örnek, zaman uyumlu g/ç 'yi sunar:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
})
Diğer seçenekler ve sınırlamalar hakkında daha fazla bilgi için Kestrel bkz.:
Uç nokta yapılandırması
varsayılan olarak, ASP.NET Core bağlar:
http://localhost:5000https://localhost:5001(bir yerel geliştirme sertifikası varsa)
Kullanarak URL 'Leri belirtin:
ASPNETCORE_URLSortam değişkeni.--urlskomut satırı bağımsız değişkeni.urlsAna bilgisayar yapılandırma anahtarı.UseUrlsgenişletme yöntemi.
Bu yaklaşımlar kullanılarak sağlanan değer bir veya daha fazla HTTP ve HTTPS uç noktası olabilir (varsayılan bir sertifika varsa HTTPS). Değeri noktalı virgülle ayrılmış bir liste olarak yapılandırın (örneğin, "Urls": "http://localhost:8000;http://localhost:8001" ).
Bu yaklaşımlar hakkında daha fazla bilgi için sunucu URL 'leri ve geçersiz kılma yapılandırmasıbölümüne bakın.
Geliştirme sertifikası oluşturuldu:
- .NET Core SDK yüklendiği zaman.
- Geliştirme-CERT aracı bir sertifika oluşturmak için kullanılır.
Bazı tarayıcılarda yerel geliştirme sertifikasına güvenmek için açık izin verilmesi gerekir.
Project şablonlar, uygulamaları https 'de varsayılan olarak çalışacak şekilde yapılandırır ve https yeniden yönlendirme ve hsts desteğiiçerir.
Listen ListenUnixSocket KestrelServerOptions URL öneklerini ve bağlantı noktalarını yapılandırmak için çağrısı yapın veya yöntemleri Kestrel .
UseUrls, --urls komut satırı bağımsız değişkeni, urls ana bilgisayar yapılandırma anahtarı ve ASPNETCORE_URLS ortam değişkeni de çalışır, ancak bu bölümün ilerleyen kısımlarında belirtilen sınırlamalara sahiptir (https uç noktası yapılandırması için varsayılan sertifika kullanılabilir olmalıdır).
KestrelServerOptions yapılandırmada
ConfigureEndpointDefaults Varsayılanları (eylem <ListenOptions> )
ActionBelirtilen her bir uç nokta için çalıştırılacak bir yapılandırma belirtir. ConfigureEndpointDefaultsBirden çok kez çağırma önceki Action s 'yi son belirtilen ile değiştirir Action .
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Not
Çağrılmadan önce çağırarak oluşturulan uç noktalara Listen ConfigureEndpointDefaults varsayılan değer uygulanmaz.
ConfigureHttpsDefaults (eylem <HttpsConnectionAdapterOptions> )
ActionHer HTTPS uç noktası için çalıştırılacak bir yapılandırma belirtir. ConfigureHttpsDefaultsBirden çok kez çağırma önceki Action s 'yi son belirtilen ile değiştirir Action .
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Not
Çağrılmadan önce çağırarak oluşturulan uç noktalara Listen ConfigureHttpsDefaults varsayılan değer uygulanmaz.
Yapılandırma (Iconation)
Kurulumu için Kestrel bir as girdisi alan bir yapılandırma yükleyicisi oluşturur IConfiguration . Yapılandırma, için yapılandırma bölümünün kapsamına alınmalıdır Kestrel .
ListenOptions. UseHttps
KestrelHTTPS kullanacak şekilde yapılandırın.
ListenOptions.UseHttps uzantılardan
UseHttps: Kestrel Varsayılan SERTIFIKAYLA HTTPS kullanacak şekilde yapılandırın. Varsayılan sertifika yapılandırılmamışsa bir özel durum oluşturur.UseHttps(string fileName)UseHttps(string fileName, string password)UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(StoreName storeName, string subject)UseHttps(StoreName storeName, string subject, bool allowInvalid)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(X509Certificate2 serverCertificate)UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)
ListenOptions.UseHttps parametrelere
filename, uygulamanın içerik dosyalarını içeren dizine göre bir sertifika dosyasının yolu ve dosya adıdır.passwordX. 509.440 sertifika verilerine erişmek için parola gereklidir.configureOptions, öğesiniActionyapılandırmak için kullanılırHttpsConnectionAdapterOptions. DöndürürListenOptions.storeName, sertifikanın yükleneceği sertifika deposudur.subject, sertifika için konu adıdır.allowInvalidgeçersiz sertifikaların, otomatik olarak imzalanan sertifikalar gibi göz önünde bulundurulmayacağını gösterir.location, sertifikanın yükleneceği mağaza konumudur.serverCertificate, X. 509.440 sertifikasıdır.
Üretimde HTTPS 'nin açıkça yapılandırılması gerekir. En azından, varsayılan bir sertifika sağlanmalıdır.
Daha sonra açıklanan desteklenen yapılandırma:
- Yapılandırma yok
- Varsayılan sertifikayı yapılandırmadan Değiştir
- Koddaki varsayılanları değiştirme
Yapılandırma yok
Kestrel ve üzerinde http://localhost:5000 dinler https://localhost:5001 (varsayılan sertifika varsa).
Varsayılan sertifikayı yapılandırmadan Değiştir
CreateDefaultBuilder``Configure(context.Configuration.GetSection("Kestrel"))yapılandırmayı yüklemek için varsayılan olarak çağırır Kestrel . İçin varsayılan bir HTTPS uygulama ayarları yapılandırma şeması bulunur Kestrel . Disk üzerindeki bir dosyadan ya da bir sertifika deposundan kullanılacak URL 'Ler ve Sertifikalar dahil olmak üzere birden çok uç nokta yapılandırın.
Aşağıdaki appsettings.json örnekte:
- Geçersiz sertifikaların kullanılmasına izin vermek için Allowwınvalid
true' i ayarlayın (örneğin, otomatik olarak imzalanan sertifikalar). - Bir sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte bulunan httpsdefaultcert ), Sertifikalar > varsayılan veya geliştirme sertifikası altında tanımlanan sertifikaya geri döner.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
},
"HttpsInlineCertStore": {
"Url": "https://localhost:5002",
"Certificate": {
"Subject": "<subject; required>",
"Store": "<certificate store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
},
"HttpsDefaultCert": {
"Url": "https://localhost:5003"
},
"Https": {
"Url": "https://*:5004",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
},
"Certificates": {
"Default": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
Herhangi bir sertifika düğümü için yol ve parola kullanmanın alternatifi sertifika deposu alanlarını kullanarak sertifikayı belirtmektir. Örneğin, sertifika > varsayılan sertifikası şu şekilde belirtilebilir:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Şema notları:
- Uç nokta adları büyük/küçük harfe duyarlıdır. Örneğin,
HTTPSveHttpsgeçerlidir. UrlHer uç nokta için parametresi gereklidir. Bu parametrenin biçimi, en üst düzeyUrlsyapılandırma parametresiyle aynıdır, ancak tek bir değerle sınırlı olur.- Bu uç noktalar, üst düzey yapılandırmada tanımlananlar yerine
Urlsbunlara ekleme yerine bunların yerini alır. Kullanılarak kodda tanımlanan uç noktalarListenyapılandırma bölümünde tanımlanan uç noktalar ile birikimlidir. - Bu
Certificatebölüm isteğe bağlıdır.CertificateBölüm belirtilmemişse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Kullanılabilir varsayılan değer yoksa, sunucu bir özel durum oluşturur ve başlayamaz. - Bu
Certificatebölüm hem yol – parolasını hem de Konu – deposu sertifikalarını destekler. - Herhangi bir sayıda uç nokta, bağlantı noktası çakışmalarına neden olmadıkları sürece bu şekilde tanımlanabilir.
options.Configure(context.Configuration.GetSection("{SECTION}"))yapılandırılmış birKestrelConfigurationLoader.Endpoint(string name, listenOptions => { })uç noktanın ayarlarını tamamlamak için kullanılabilecek bir yöntemi olan bir döndürür:
webBuilder.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader , tarafından sağlana gibi var olan yükleyicisindeki yinelemeye devam etmek için doğrudan erişilebilir CreateDefaultBuilder .
- Her uç noktanın yapılandırma bölümü,
Endpointözel ayarların okunabilmesi için yöntemindeki seçeneklerde kullanılabilir. - Birden çok yapılandırma,
options.Configure(context.Configuration.GetSection("{SECTION}"))başka bir bölümle yeniden çağırarak yüklenebilir. Önceki örneklerde açıkça çağrılmadığı takdirde, yalnızca son yapılandırma kullanılırLoad. Metapackage,Loadvarsayılan yapılandırma bölümünün değiştirilmesini sağlayacak şekilde çağırmıyor. KestrelConfigurationLoader``ListenAPI ailesiniKestrelServerOptionsEndpointaşırı yükleme olarak yansıtır, bu nedenle kod ve yapılandırma uç noktaları aynı yerde yapılandırılabilir. Bu aşırı yüklemeler adları kullanmaz ve yalnızca yapılandırmadan varsayılan ayarları kullanır.
Koddaki varsayılanları değiştirme
ConfigureEndpointDefaults ve ConfigureHttpsDefaults ListenOptions HttpsConnectionAdapterOptions , önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma dahil, ve için varsayılan ayarları değiştirmek üzere kullanılabilir. ConfigureEndpointDefaults ve ConfigureHttpsDefaults herhangi bir uç nokta yapılandırılmadan önce çağrılmalıdır.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Kestrel SNı desteği
Sunucu adı belirtme (SNı) , aynı IP adresi ve bağlantı noktası üzerinde birden fazla etki alanını barındırmak için kullanılabilir. SNı 'nin çalışması için, istemci, TLS el sıkışması sırasında güvenli oturum ana bilgisayar adını, sunucunun doğru sertifikayı sağlayabilmesi için gönderir. İstemci, TLS anlaşmasını izleyen güvenli oturum sırasında sunucuyla şifreli iletişim için bulunan sertifikayı kullanır.
Kestrel geri çağırma aracılığıyla SNı 'yi destekler ServerCertificateSelector . Geri çağırma, uygulamanın ana bilgisayar adını incelemesine ve uygun sertifikayı seçmesini sağlamak için bağlantı başına bir kez çağrılır.
SNı desteği şunları gerektirir:
- Hedef Framework
netcoreapp2.1veya sonraki sürümlerde çalışıyor.net461Veya sonraki sürümlerde, geri çağırma çağrılır, ancaknameher zaman olurnull.nameAyrıca,nullISTEMCI, TLS el sıkışmasının ana bilgisayar adı parametresini sağlamıyorsa de olur. - Tüm Web siteleri aynı örnek üzerinde çalışır Kestrel . Kestrel , bir IP adresinin ve bağlantı noktasının bir ters proxy olmadan birden çok örnek arasında paylaşılmasını desteklemez.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var subExampleCert = CertificateLoader.LoadFromStoreCert(
"sub.example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var certs = new Dictionary<string, X509Certificate2>(
StringComparer.OrdinalIgnoreCase);
certs["localhost"] = localhostCert;
certs["example.com"] = exampleCert;
certs["sub.example.com"] = subExampleCert;
httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
{
if (name != null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
});
Bağlantı günlüğü
UseConnectionLoggingBir bağlantıda bayt düzeyinde iletişim Için hata ayıklama düzeyi günlüklerini yayma çağrısı. Bağlantı günlüğü, TLS şifreleme ve proxy 'nin arkasındaki gibi alt düzey iletişimde sorunları gidermeye yardımcı olur. UseConnectionLoggingDaha önce yerleştirilmişse UseHttps , şifrelenmiş trafik günlüğe kaydedilir. UseConnectionLoggingÖğesinden sonra yerleştirilmişse UseHttps , şifresi çözülmüş trafik günlüğe kaydedilir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
TCP yuvasına bağlama
ListenYöntemi BIR TCP yuvasına bağlanır ve bir seçenek lambda X. 509.440 sertifika yapılandırmasına izin verir:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001,
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testPassword");
});
})
.UseStartup<Startup>();
});
Örnek, HTTPS 'yi ile bir uç nokta için yapılandırır ListenOptions . Belirli uç noktalara yönelik diğer ayarları yapılandırmak için aynı API 'yi kullanın Kestrel .
Windows 'da, otomatik olarak imzalanan sertifikalar New-SelfSignedCertificate PowerShell cmdlet 'ikullanılarak oluşturulabilir. Desteklenmeyen bir örnek için bkz. UpdateIISExpressSSLForChrome.ps1.
MacOS, Linux ve Windows 'da, Sertifikalar OpenSSLkullanılarak oluşturulabilir.
UNIX yuvasına bağlama
ListenUnixSocketAşağıdaki örnekte gösterildiği gibi NGINX ile gelişmiş performans için ile birlikte bir UNIX yuvası dinleyin:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock",
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testpassword");
});
})
- NGINX yapılandırma dosyasında,
server>location>proxy_passgirdisini olarak ayarlayınhttp://unix:/tmp/{KESTREL SOCKET}:/;.{KESTREL SOCKET}, için belirtilen yuvanın adıdır ListenUnixSocket (örneğin,kestrel-test.sockÖnceki örnekte). - Yuvanın NGINX tarafından yazılabilir olduğundan emin olun (örneğin,
chmod go+w /tmp/kestrel-test.sock).
Bağlantı noktası 0
Bağlantı noktası numarası 0 belirtildiğinde, Kestrel dinamik olarak kullanılabilir bir bağlantı noktasına bağlanır. Aşağıdaki örnek, çalışma zamanında gerçekten hangi bağlantı noktasının bağlandığını nasıl belirleyeceğini göstermektedir Kestrel :
public void Configure(IApplicationBuilder app)
{
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
app.UseStaticFiles();
app.Run(async (context) =>
{
context.Response.ContentType = "text/html";
await context.Response
.WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
"<title></title></head><body><p>Hosted by Kestrel</p>");
if (serverAddressesFeature != null)
{
await context.Response
.WriteAsync("<p>Listening on the following addresses: " +
string.Join(", ", serverAddressesFeature.Addresses) +
"</p>");
}
await context.Response.WriteAsync("<p>Request URL: " +
$"{context.Request.GetDisplayUrl()}<p>");
});
}
Uygulama çalıştırıldığında konsol penceresi çıkışı, uygulamanın erişilebileceği dinamik bağlantı noktasını gösterir:
Listening on the following addresses: http://127.0.0.1:48508
Sınırlamalar
Aşağıdaki yaklaşımlar ile uç noktaları yapılandırın:
- UseUrls
--urlskomut satırı bağımsız değişkeniurlsAna bilgisayar yapılandırma anahtarıASPNETCORE_URLSortam değişkeni
Bu yöntemler, kodun dışındaki sunucularla kod çalışmasını sağlamak için yararlıdır Kestrel . Ancak, aşağıdaki sınırlamalara dikkat edin:
- HTTPS uç noktası yapılandırmasında varsayılan bir sertifika sağlanmadığı sürece HTTPS bu yaklaşımlar ile kullanılamaz (örneğin,
KestrelServerOptionsBu konunun önceki kısımlarında gösterildiği gibi yapılandırma veya yapılandırma dosyası kullanılıyor). - Hem hem de
ListenUseUrlsyaklaşımları aynı anda kullanıldığında, uç noktalarListenUseUrlsuç noktaları geçersiz kılar.
IIS uç nokta yapılandırması
IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya ya da tarafından ayarlanır Listen UseUrls . daha fazla bilgi için ASP.NET Core modülü konusuna bakın.
ListenOptions. Protocols
ProtocolsÖzelliği, HttpProtocols bir bağlantı uç noktasında veya sunucu IÇIN etkin HTTP protokollerini () belirler. ProtocolsSabit listesinden özelliğe bir değer atayın HttpProtocols .
HttpProtocols sabit listesi değeri |
Bağlantı protokolü izin verildi |
|---|---|
Http1 |
Yalnızca HTTP/1.1. , TLS olmadan veya ile kullanılabilir. |
Http2 |
Yalnızca HTTP/2. Yalnızca istemci önceki bir bilgi modunuDESTEKLIYORSA, TLS olmadan kullanılabilir. |
Http1AndHttp2 |
HTTP/1.1 ve HTTP/2. HTTP/2, istemcinin TLS uygulama katmanı protokol anlaşması (ALPN) el sıkışmasında http/2 seçmesini gerektirir; Aksi takdirde, bağlantı varsayılan olarak HTTP/1.1 ' dir. |
ListenOptions.ProtocolsHerhangi bir uç nokta için varsayılan değer HttpProtocols.Http1AndHttp2 .
HTTP/2 için TLS kısıtlamaları:
- TLS sürüm 1,2 veya üzeri
- Yeniden anlaşma devre dışı
- Sıkıştırma devre dışı
- En az kısa ömürlü anahtar değişim boyutları:
- Eliptik Eğri Diffie-Hellman (ECDHE) [ RFC4492 ] : 224 bit minimum
- Sınırlı alan Diffie-Hellman (DHE) [
TLS12] : 2048 bit minimum
- Şifre paketi yasaklandı.
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256[TLS-ECDHE] P-256 eliptik eğrisi [ FIPS186 ] Varsayılan olarak desteklenir.
Aşağıdaki örnek, 8000 numaralı bağlantı noktasında HTTP/1.1 ve HTTP/2 bağlantılarına izin verir. Bağlantılar, sağlanan bir sertifikayla TLS ile güvenlidir:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Gerektiğinde belirli şifrelemeler için TLS el sıkışmaları için bağlantı temelinde filtre uygulamak üzere bağlantı ara yazılımı kullanın.
Aşağıdaki örnek, NotSupportedException uygulamanın desteklemediği herhangi bir şifre algoritması için oluşturur. Alternatif olarak, ılshandshakefeature. CipherAlgorithm öğesini kabul edilebilir şifreleme paketleri listesi ile tanımlayın ve karşılaştırın.
CipherAlgorithmType. null şifre algoritması ile hiçbir şifreleme kullanılmaz.
// using System.Net;
// using Microsoft.AspNetCore.Connections;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.UseTlsFilter();
});
});
using System;
using System.Security.Authentication;
using Microsoft.AspNetCore.Connections.Features;
namespace Microsoft.AspNetCore.Connections
{
public static class TlsFilterConnectionMiddlewareExtensions
{
public static IConnectionBuilder UseTlsFilter(
this IConnectionBuilder builder)
{
return builder.Use((connection, next) =>
{
var tlsFeature = connection.Features.Get<ITlsHandshakeFeature>();
if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
{
throw new NotSupportedException("Prohibited cipher: " +
tlsFeature.CipherAlgorithm);
}
return next();
});
}
}
}
Bağlantı filtrelemesi, bir lambda aracılığıyla da yapılandırılabilir IConnectionBuilder :
// using System;
// using System.Net;
// using System.Security.Authentication;
// using Microsoft.AspNetCore.Connections;
// using Microsoft.AspNetCore.Connections.Features;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.Use((context, next) =>
{
var tlsFeature = context.Features.Get<ITlsHandshakeFeature>();
if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
{
throw new NotSupportedException(
$"Prohibited cipher: {tlsFeature.CipherAlgorithm}");
}
return next();
});
});
});
Linux 'ta, CipherSuitesPolicy TLS el sıkışmaları her bağlantı temelinde filtrelemek için kullanılabilir:
// using System.Net.Security;
// using Microsoft.AspNetCore.Hosting;
// using Microsoft.AspNetCore.Server.Kestrel.Core;
// using Microsoft.Extensions.DependencyInjection;
// using Microsoft.Extensions.Hosting;
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.OnAuthenticate = (context, sslOptions) =>
{
sslOptions.CipherSuitesPolicy = new CipherSuitesPolicy(
new[]
{
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
// ...
});
};
});
});
Protokolü yapılandırmadan ayarla
CreateDefaultBuilder``serverOptions.Configure(context.Configuration.GetSection("Kestrel"))yapılandırmayı yüklemek için varsayılan olarak çağırır Kestrel .
Aşağıdaki appsettings.json örnek, tüm uç noktalar için varsayılan bağlantı protokolü olarak http/1.1 'yi kurar:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
Aşağıdaki appsettings.json örnek, belirli bir uç nokta IÇIN http/1.1 bağlantı protokolünü belirler:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
Yapılandırma tarafından ayarlanan kod geçersiz kılma değerlerinde belirtilen protokoller.
URL önekleri
UseUrls, --urls Komut satırı bağımsız değişkeni, urls ana bilgisayar yapılandırma anahtarı veya ASPNETCORE_URLS ortam değişkeni kullanılırken, URL önekleri aşağıdaki biçimlerden birinde olabilir.
Yalnızca HTTP URL ön ekleri geçerlidir. Kestrel , kullanılarak URL bağlamaları yapılandırılırken HTTPS 'YI desteklemez UseUrls .
Bağlantı noktası numarası olan IPv4 adresi
http://65.55.39.10:80/0.0.0.0Tüm IPv4 adreslerine bağlanan özel bir durumdur.Bağlantı noktası numarasına sahip IPv6 adresi
http://[0:0:0:0:0:ffff:4137:270a]:80/[::], IPv4 'un IPv6 eşdeğeridir0.0.0.0.Bağlantı noktası numarası olan ana bilgisayar adı
http://contoso.com:80/ http://*:80/, Ve ana bilgisayar adları
*+özel değildir. Geçerli bir IP adresi olarak tanınmayan veyalocalhosttüm IPv4 ve IPv6 IP 'lerine bağlanan her şey. farklı ana bilgisayar adlarını aynı bağlantı noktasında farklı ASP.NET Core uygulamalarına bağlamak için, HTTP.sys veya ııs, ngınx veya Apache gibi bir ters proxy sunucusunu kullanın.Uyarı
Ters Proxy yapılandırmasında barındırma, Iletilen üstbilgiler ara yazılım yapılandırmasınıgerektirir.
Port numarası
localhostveya bağlantı noktası numarası ile geri döngü IP 'si olan ana bilgisayar adıhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/localhostBelirtildiğinde, Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerine bağlamayı dener. İstenen bağlantı noktası, herhangi bir geri döngü arabirimindeki başka bir hizmet tarafından kullanılıyorsa Kestrel başlatılamıyor. Herhangi bir geri döngü arabirimi başka bir nedenle kullanılamıyorsa (genellikle IPv6 desteklenmediği için), Kestrel bir uyarı kaydeder.
Konak filtreleme
Kestrel, Gibi önekleri temel alarak yapılandırmayı desteklerken http://example.com:5000 , büyük Kestrel ölçüde ana bilgisayar adını yoksayar. Ana bilgisayar localhost , geri döngü adreslerine bağlama için kullanılan özel bir durumdur. Açık IP adresi dışındaki tüm ana bilgisayar tüm genel IP adreslerine bağlanır. Host Üstbilgiler doğrulanmadı.
Geçici bir çözüm olarak, ana bilgisayar filtreleme ara yazılımı kullanın. ana bilgisayar filtreleme ara yazılımı, ASP.NET Core uygulamaları için örtük olarak sunulan Microsoft. aspnetcore. hostfiltering paketi tarafından sağlanır. Ara yazılım tarafından eklenir CreateDefaultBuilder ve şunları çağırır AddHostFiltering :
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Ana bilgisayar filtreleme ara yazılımı varsayılan olarak devre dışıdır. Ara yazılımı etkinleştirmek için AllowedHosts appSettings 'de bir anahtar tanımlayın appsettings.json / . <EnvironmentName> . JSON. Değer, bağlantı noktası numaraları olmayan ana bilgisayar adlarının noktalı virgülle ayrılmış listesidir:
appsettings.json:
{
"AllowedHosts": "example.com;localhost"
}
Not
Iletilen üstbilgiler ara yazılımı da bir AllowedHosts seçenek içerir. İletilen üstbilgiler ara yazılımı ve ana bilgisayar filtreleme ara yazılımı, farklı senaryolar için benzer işlevlere sahiptir. AllowedHostsIletilen üstbilgiler ara yazılımı ile, Host istekler ters bir ara sunucu veya yük dengeleyici ile iletilirken üst bilgi korunurken, bu işlem için uygun bir ayar vardır. AllowedHostsAna bilgisayar filtreleme ara yazılımı ile ayarlandığında, Kestrel genel kullanıma yönelik bir uç sunucu olarak veya Host üst bilgi doğrudan iletildiğinde kullanılır.
Iletilen üstbilgiler ara yazılımı hakkında daha fazla bilgi için bkz Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma ..
Libuv aktarım yapılandırması
Libuv () kullanımını gerektiren projeler için UseLibuv :
Microsoft.AspNetCore.Server.Kestrel.Transport.LibuvUygulamanın proje dosyasına paket için bir bağımlılık ekleyin:<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="{VERSION}" />Şunu çağırın UseLibuv
IWebHostBuilder:public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseLibuv(); webBuilder.UseStartup<Startup>(); }); }
HTTP/1.1 istek boşaltma
HTTP bağlantılarının açılması zaman alabilir. HTTPS için de kaynak kullanımı yoğun bir işlemdir. Bu nedenle, Kestrel http/1.1 protokolü başına bağlantıları yeniden kullanmaya çalışır. Bağlantının yeniden kullanılmasına izin vermek için bir istek gövdesi tam olarak tüketilmelidir. Uygulama, POST sunucunun yeniden yönlendirme veya 404 yanıtı döndürdüğü bir istek gibi her zaman istek gövdesini tüketmez. POSTYeniden yönlendirme durumunda:
- İstemci, verilerin bir bölümünü zaten göndermiş olabilir
POST. - Sunucu 301 yanıtını yazar.
POSTÖnceki istek gövdesinden gelen veriler tam olarak okunana kadar bağlantı yeni bir istek için kullanılamaz.- Kestrel istek gövdesini boşaltmaya çalışır. İstek gövdesini boşaltma işlemi işlemeden verileri okuma ve atma anlamına gelir.
Boşaltma işlemi bağlantının yeniden kullanılmasına izin verme ve kalan verilerin boşaltıma süresi arasında bir ilerleme gerçekleştirir:
- Boşaltma, yapılandırılabilir olmayan beş saniyelik bir zaman aşımına sahip olur.
- Veya üstbilgisi tarafından belirtilen tüm veriler
Content-LengthTransfer-Encodingzaman aşımından önce okunmadıysa bağlantı kapatılır.
Bazen, yanıtı yazmadan önce veya sonra isteği hemen sonlandırmak isteyebilirsiniz. Örneğin, istemciler sınırlı verilerin büyük bir düzeyi olabilir, bu nedenle karşıya yüklenen verileri sınırlamak bir öncelik olabilir. Bu tür durumlarda bir isteği sonlandırmak için bir denetleyici, sayfa veya ara yazılım aracılığıyla HttpContext. Abort ' ı çağırın Razor .
Çağırmanın uyarıları vardır Abort :
- Yeni bağlantı oluşturma yavaş ve pahalı olabilir.
- İstemcinin bağlantı kapanmadan önce yanıtı okuduğunuzdan emin olmaz.
- Çağırma
Abort, yaygın hatalara değil önemli hata durumları için nadir ve ayrılmış olmalıdır.- Yalnızca
Abortbelirli bir sorunun çözülmesi gerektiğinde çağırın. Örneğin,Abortkötü amaçlı istemciler veri almaya çalışıyorsaPOSTveya istemci kodunda büyük veya çok sayıda isteğe neden olan bir hata olduğunda çağırın. AbortHTTP 404 (bulunamadı) gibi yaygın hata durumları için çağrı yapmayın.
- Yalnızca
Çağrılmadan önce HttpResponse. tamamlana eşitlemesini çağırmak Abort Sunucunun yanıtı yazmayı tamamlamasını sağlar. Ancak, istemci davranışı tahmin edilebilir değildir ve bağlantı durdurulmadan önce yanıtı okuyamayabilir.
Bu işlem HTTP/2 için farklıdır çünkü protokol, bağlantıyı kapatmadan bağımsız istek akışlarını iptal etme işlemini destekler. Beş saniyelik boşaltma zaman aşımı uygulanmaz. Yanıt tamamlandıktan sonra herhangi bir okunmamış istek gövdesi verisi varsa, sunucu bir HTTP/2 RST çerçevesi gönderir. Ek istek gövdesi veri çerçeveleri yok sayılır.
Mümkünse, istemcilerin Beklenen: 100-Continue istek üst bilgisini kullanabilmesi ve istek gövdesini göndermeden önce sunucunun yanıt vermesini beklemek daha iyidir. Bu, istemciye gereksiz verileri göndermeden önce yanıtı İnceleme ve iptal etme olanağı sunar.
Ek kaynaklar
- Linux üzerinde UNIX yuvaları kullanırken, yuva uygulama kapatılırken otomatik olarak silinmez. daha fazla bilgi için bu GitHub sorunabakın.
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core 'de HTTPS 'yi zorla
- Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma
- RFC 7230: Ileti sözdizimi ve yönlendirme (Bölüm 5,4: Ana bilgisayar)
KestrelASP.NET Core için platformlar arası Web sunucusudur. Kestrel, varsayılan olarak ASP.NET Core proje şablonlarında bulunan web sunucusudur.
Kestrel aşağıdaki senaryoları destekler:
- HTTPS
- WebSockets 'i etkinleştirmek için kullanılan donuk yükseltme
- NGINX 'in arkasında yüksek performans için UNIX Yuvaları
- HTTP/2 (macOS hariç † )
†HTTP/2, gelecek sürümlerde macOS 'ta desteklenecektir.
Kestrel , .NET Core 'un desteklediği tüm platformlarda ve sürümlerde desteklenir.
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
HTTP/2 desteği
aşağıdaki temel gereksinimler karşılanıyorsa, HTTP/2 ASP.NET Core uygulamalar için kullanılabilir:
- İşletim sistemi†
- Windows Server 2016/Windows 10 veya üzeri‡
- OpenSSL 1.0.2 veya üzerini içeren Linux (örneğin, Ubuntu 16,04 veya üzeri)
- Hedef Framework: .NET Core 2,2 veya üzeri
- Uygulama katmanı protokol anlaşması (ALPN) bağlantısı
- TLS 1,2 veya üzeri bağlantı
†HTTP/2, gelecek sürümlerde macOS 'ta desteklenecektir. ‡KestrelWindows Server 2012 R2 ve Windows 8.1 üzerinde HTTP/2 için sınırlı destek içerir. Bu işletim sistemlerinde kullanılabilir olan desteklenen TLS şifre paketlerinin listesi sınırlı olduğundan destek sınırlıdır. TLS bağlantılarının güvenliğini sağlamak için Eliptik Eğri dijital Imza algoritması (ECDSA) kullanılarak oluşturulan bir sertifika gerekli olabilir.
Bir HTTP/2 bağlantısı kurulduysa, HttpRequest. Protocol Reports HTTP/2 .
HTTP/2 varsayılan olarak devre dışıdır. Yapılandırma hakkında daha fazla bilgi için Kestrel Options ve listenoptions. Protocols bölümlerine bakın.
KestrelTers ara sunucu ile ne zaman kullanılır?
Kestrel, kendisi veya Internet Information Services (ııs), ngınxveya Apachegibi bir ters ara sunucu ile kullanılabilir. Ters bir ara sunucu, ağdan gelen HTTP isteklerini alır ve ' a iletir Kestrel .
Kestrel sınır (Internet 'e yönelik) Web sunucusu olarak kullanılır:

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

İki yapılandırma de, ters ara sunucu sunucusuyla veya olmadan, desteklenen bir barındırma yapılandırması.
Kestrel ters ara sunucu olmayan bir uç sunucu olarak kullanılması, birden çok işlem arasında aynı IP ve bağlantı noktasının paylaşılmasını desteklemez. KestrelBir bağlantı noktasını dinlemek üzere yapılandırıldığında, Kestrel istek üst bilgilerinden bağımsız olarak bu bağlantı noktası için tüm trafiği işler Host . Bağlantı noktalarını paylaşabilen bir ters proxy, istekleri Kestrel benzersiz BIR IP ve bağlantı noktası üzerinde iletme olanağına sahiptir.
Ters proxy sunucusu gerekli olmasa bile, ters proxy sunucu kullanılması iyi bir seçim olabilir.
Ters proxy:
- , Barındırdığı uygulamaların açığa çıkarılan genel yüzey alanını sınırlayabilir.
- Ek bir yapılandırma ve savunma katmanı sağlayın.
- , Mevcut altyapıyla daha iyi tümleşebilir.
- Yük dengelemeyi ve güvenli iletişim (HTTPS) yapılandırmasını kolaylaştırın. Yalnızca ters proxy sunucusu bir X. 509.440 sertifikası gerektirir ve bu sunucu, düz HTTP kullanarak, iç ağdaki uygulamanın sunucularıyla iletişim kurabilir.
Uyarı
Ters Proxy yapılandırmasında barındırma, Iletilen üstbilgiler ara yazılım yapılandırmasınıgerektirir.
KestrelASP.NET Core uygulamalarında kullanma
Microsoft. AspNetCore. Server. Kestrel paket, Microsoft.AspNetCore.app metapackage'e dahildir.
ASP.NET Core proje şablonları Kestrel varsayılan olarak kullanır. Program. cs' de, arka planda çağıran şablon kodu çağırır CreateDefaultBuilder UseKestrel .
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
Ana bilgisayarı hakkında daha fazla bilgi için CreateDefaultBuilder , uygulamasının konak ayarlama bölümüne bakın ASP.NET Core Web ana bilgisayarı .
Çağrıldıktan sonra ek yapılandırma sağlamak için CreateDefaultBuilder şunu kullanın ConfigureKestrel :
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
// Set properties and call methods on serverOptions
});
Uygulama, CreateDefaultBuilder Konağı kurmak için çağırmazsa, UseKestrel çağrılmadan önce çağırın ConfigureKestrel :
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel()
.UseIISIntegration()
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
// Set properties and call methods on serverOptions
})
.Build();
host.Run();
}
Kestrel Seçenekler
KestrelWeb sunucusu, Internet 'e yönelik dağıtımlarda özellikle yararlı olan kısıtlama yapılandırma seçeneklerine sahiptir.
Sınıfının özelliğinde kısıtlamaları ayarlayın Limits KestrelServerOptions . LimitsÖzelliği, sınıfının bir örneğini barındırır KestrelServerLimits .
Aşağıdaki örnekler Microsoft.AspNetCore.Server.Kestrel.Core ad alanını kullanır:
using Microsoft.AspNetCore.Server.Kestrel.Core;
Kestrel Aşağıdaki örneklerde C# kodunda yapılandırılan seçenekler, bir yapılandırma sağlayıcısıkullanılarak da ayarlanabilir. Örneğin, dosya yapılandırma sağlayıcısı Kestrel Yapılandırmayı bir appsettings.json veya appSettings 'ten yükleyebilir . { Environment}. JSON dosyası:
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
}
}
}
Aşağıdaki yaklaşımlardan birini kullanın:
Yapılandırma Kestrel
Startup.ConfigureServices:Sınıfına bir örneği
IConfigurationekleyinStartup. Aşağıdaki örnek, eklenen yapılandırmanın özelliğe atandığını varsayarConfiguration.Startup.ConfigureServices' De,Kestrelyapılandırma bölümünü yapılandırma bölümüne yükleyin Kestrel :using Microsoft.Extensions.Configuration public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.Configure<KestrelServerOptions>( Configuration.GetSection("Kestrel")); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... } }
KestrelKonağı oluştururken yapılandırın:
Program. cs' de
Kestrelyapılandırma bölümünü yapılandırma bölümüne yükleyin Kestrel :// using Microsoft.Extensions.DependencyInjection; public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { services.Configure<KestrelServerOptions>( context.Configuration.GetSection("Kestrel")); }) .UseStartup<Startup>();
Yukarıdaki yaklaşımların her ikisi de herhangi bir yapılandırma sağlayıcısıylaçalışır.
Etkin tut zaman aşımı
Etkin tutma zaman aşımınıalır veya ayarlar. Varsayılan olarak 2 dakikadır.
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
İstemci bağlantıları üst sınırı
MaxConcurrentConnections MaxConcurrentUpgradedConnections
En fazla eş zamanlı açık TCP bağlantısı sayısı tüm uygulama için aşağıdaki kodla ayarlanabilir:
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
HTTP veya HTTPS 'den başka bir protokole (örneğin, bir WebSockets isteğinde) yükseltilen bağlantılara yönelik ayrı bir sınır vardır. Bir bağlantı yükseltildikten sonra, bu sınıra göre sayılmaz MaxConcurrentConnections .
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
En fazla bağlantı sayısı, varsayılan olarak sınırsız (null).
En büyük istek gövdesi boyutu
Varsayılan en büyük istek gövdesi boyutu 30.000.000 bayttır ve bu değer yaklaşık 28,6 MB 'tır.
ASP.NET Core MVC uygulamasında sınırı geçersiz kılmak için önerilen yaklaşım, RequestSizeLimitAttribute bir eylem yönteminde özniteliğini kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Her istekte uygulama için kısıtlamanın nasıl yapılandırılacağını gösteren bir örnek aşağıda verilmiştir:
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
Ara yazılım içindeki belirli bir istek üzerindeki ayarı geçersiz kılın:
app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var minRequestRateFeature =
context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
var minResponseRateFeature =
context.Features.Get<IHttpMinResponseDataRateFeature>();
if (minRequestRateFeature != null)
{
minRequestRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
if (minResponseRateFeature != null)
{
minResponseRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
Uygulama isteği okumaya başladıktan sonra bir istek üzerindeki sınırı yapılandırırsa, bir özel durum oluşturulur. IsReadOnlyÖzelliğin salt okuma durumunda olup olmadığını belirten bir özellik vardır. Bu, MaxRequestBodySize sınırı yapılandırmanın çok geç olduğunu gösterir.
bir uygulama ASP.NET Core modülününarkasında çalıştırıldığında , Kestrel ııs sınırı zaten ayarladığı için istek gövdesi boyut sınırı devre dışı bırakılır.
En az istek gövdesi veri hızı
MinRequestBodyDataRate MinResponseDataRate
Kestrel veriler belirtilen hızda bayt/saniye olarak ulaşan her saniye bir denetler. Oran en düşük değerin altına düşerse bağlantı zaman aşımına uğrar. Yetkisiz kullanım süresi, Kestrel istemcinin gönderme hızını en düşüye artırması için gereken süredir. bu süre boyunca fiyat denetlenmez. Yetkisiz kullanım süresi, TCP yavaş başlatma nedeniyle başlangıçta verileri yavaş bir hızda gönderen bağlantıların bırakılmasını önlemeye yardımcı olur.
Varsayılan en düşük oran, 5 saniyelik bir yetkisiz kullanım süresi ile 240 bayt/saniye olur.
Yanıt için bir minimum oran da geçerlidir. İstek sınırını ayarlamaya yönelik kod ve yanıt sınırı, RequestBody Response özellik ve arabirim adlarında olduğu gibi aynı olur.
İşte, program. cs' de en düşük veri hızlarının nasıl yapılandırılacağını gösteren bir örnek:
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
Ara yazılım içindeki istek başına düşen minimum hız sınırlarını geçersiz kılın:
app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var minRequestRateFeature =
context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
var minResponseRateFeature =
context.Features.Get<IHttpMinResponseDataRateFeature>();
if (minRequestRateFeature != null)
{
minRequestRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
if (minResponseRateFeature != null)
{
minResponseRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
HttpContext.Featuresİstek çoğullama için protokol desteği nedeniyle, http/2 için bir istek başına hız sınırlarını değiştirmek, http/2 istekleri için, önceki örnekte başvurulan hiçbir oran özelliği mevcut değil. KestrelServerOptions.LimitsHttp/1. x ve http/2 bağlantılarına hala uygulanan sunucu genelindeki hız sınırları.
İstek üst bilgileri zaman aşımı
Sunucunun istek üst bilgilerini alması için harcadığı en uzun süreyi alır veya ayarlar. Varsayılan değer 30 saniyedir.
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
Bağlantı başına en fazla akış
Http2.MaxStreamsPerConnection HTTP/2 bağlantısı başına eşzamanlı istek akışı sayısını sınırlar. Fazlalık akışlar reddedildi.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Varsayılan değer 100’dür.
Üst bilgi tablosu boyutu
HPACK kod çözücü, HTTP/2 bağlantıları için HTTP üst bilgilerini sıkıştırıyor. Http2.HeaderTableSize , HPACK kod çözücüs tarafından kullanılan üst bilgi sıkıştırma tablosu boyutunu sınırlar. Değer sekizli olarak sağlanır ve sıfırdan (0) büyük olmalıdır.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Varsayılan değer 4096'dır.
En büyük çerçeve boyutu
Http2.MaxFrameSize , alacak HTTP/2 bağlantı çerçevesi yükünün maksimum boyutunu gösterir. Değer sekizli olarak sağlanmıştır ve 2^14 (16.384) ile 2^24-1 (16.777.215) arasında olması gerekir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16384;
});
Varsayılan değer 2^14 'tir (16.384).
En büyük istek üst bilgisi boyutu
Http2.MaxRequestHeaderFieldSize , istek üst bilgisi değerlerinin sekizlileri içinde izin verilen en büyük boyutu gösterir. Bu sınır, sıkıştırılmış ve sıkıştırılmamış gösterimlerinde hem ad hem de değer için geçerlidir. Değer sıfırdan (0) büyük olmalıdır.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
Varsayılan değer 8.192'dir.
İlk bağlantı penceresi boyutu
Http2.InitialConnectionWindowSize , sunucu arabelleklerinin bağlantı başına tüm istekler (akışlar) arasında toplanmış bayt cinsinden en yüksek istek gövdesi verilerini gösterir. İstekler de ile Http2.InitialStreamWindowSize sınırlıdır. Değer 65.535'e eşit veya daha büyük ve 2^31'den (2.147.483.648) küçük olması gerekir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});
Varsayılan değer 128 KB'tır (131.072).
İlk akış penceresi boyutu
Http2.InitialStreamWindowSize , istek (akış) başına bir defada sunucu arabelleklerinin bayt cinsinden en yüksek istek gövdesi verilerini gösterir. İstekler de ile Http2.InitialStreamWindowSize sınırlıdır. Değer 65.535'e eşit veya daha büyük ve 2^31'den (2.147.483.648) küçük olması gerekir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});
Varsayılan değer 96 KB'tır (98.304).
Zaman Uyumlu G/Ç
AllowSynchronousIO , istek ve yanıt için zaman uyumlu bir I/O'ya izin verili olup olmadığını kontrol eder. Varsayılan değer: true .
Uyarı
Çok sayıda engelleme zaman uyumlu I/O işlemleri iş parçacığı havuzu açlıklarına neden olabilir ve bu da uygulamanın yanıt vermemeye neden olur. Yalnızca AllowSynchronousIO zaman uyumsuz I/O'yi desteklemez bir kitaplık kullanırken etkinleştirin.
Aşağıdaki örnek zaman uyumlu I/O'yi sağlar:
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.AllowSynchronousIO = true;
});
Diğer seçenekler ve sınırlar Kestrel hakkında bilgi için bkz:
Uç nokta yapılandırması
Varsayılan olarak, ASP.NET Core şu bağlantılara bağlanıyor:
http://localhost:5000https://localhost:5001(yerel bir geliştirme sertifikası mevcut olduğunda)
Şu url'leri kullanarak URL'leri belirtin:
ASPNETCORE_URLSortam değişkeni.--urlskomut satırı bağımsız değişkeni.urlskonak yapılandırma anahtarı.UseUrlsextension yöntemi.
Bu yaklaşımlar kullanılarak sağlanan değer bir veya daha fazla HTTP ve HTTPS uç noktası (varsayılan sertifika varsa HTTPS) olabilir. Değeri noktalı virgülle ayrılmış liste (örneğin, ) olarak "Urls": "http://localhost:8000;http://localhost:8001" yapılandırma.
Bu yaklaşımlar hakkında daha fazla bilgi için bkz. Sunucu URL'leri ve Geçersiz Kılma yapılandırması.
Bir geliştirme sertifikası oluşturulur:
- Uygulama .NET Core SDK yüklenir.
- Bir sertifika oluşturmak için dev-certs aracı kullanılır.
Bazı tarayıcıların yerel geliştirme sertifikasına güvenmesi için açık izin verilmesi gerekir.
Project şablonları, uygulamaları varsayılan olarak HTTPS üzerinde çalıştıracak şekilde yapılandırarak HTTPS yeniden yönlendirme ve HSTS desteği içerir.
URL Listen ön ListenUnixSocket eklerini ve bağlantı noktalarını yapılandırmak için çağrısı KestrelServerOptions veya Kestrel yöntemleri.
UseUrls, komut satırı bağımsız değişkeni, konak yapılandırma anahtarı ve ortam değişkeni de çalışır, ancak bu bölümün ilerleyen kısımlarında (HTTPS uç noktası yapılandırması için varsayılan sertifikanın kullanılabilir olması --urls urls ASPNETCORE_URLS gerekir) sınırlamalara sahiptir.
KestrelServerOptions Yapılandırma:
ConfigureEndpointDefaults(Eylem <ListenOptions> )
Belirtilen her uç nokta Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureEndpointDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Not
Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureEndpointDefaults uç noktaların varsayılan değerleri uygulanmaz.
ConfigureHttpsDefaults(Eylem <HttpsConnectionAdapterOptions> )
Her HTTPS uç noktası Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureHttpsDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Not
Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureHttpsDefaults uç noktaların varsayılan değerleri uygulanmaz.
Configure(IConfiguration)
Giriş olarak alan bir ayar için Kestrel bir yapılandırma IConfiguration yükleyicisi oluşturur. Yapılandırmanın kapsamı için yapılandırma bölümü olarak Kestrel genişletildi.
ListenOptions.UseHttps
KestrelHTTPS kullanmak için yapılandırma.
ListenOptions.UseHttps Uzantı -ları:
UseHttps: Varsayılan Kestrel sertifika ile HTTPS kullanmak üzere yapılandırma. Varsayılan sertifika yapılandırılmamışsa bir özel durum oluşturur.UseHttps(string fileName)UseHttps(string fileName, string password)UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(StoreName storeName, string subject)UseHttps(StoreName storeName, string subject, bool allowInvalid)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(X509Certificate2 serverCertificate)UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)
ListenOptions.UseHttps Parametre:
filename, uygulamanın içerik dosyalarını içeren dizine göre bir sertifika dosyasının yolu ve dosya adıdır.password, X.509 sertifika verilerine erişmek için gereken paroladır.configureOptions, yapılandırmakActioniçin bir 'dır.HttpsConnectionAdapterOptionsdöndürür.ListenOptionsstoreName, sertifikanın yükln olduğu sertifika deposu.subject, sertifikanın konu adıdır.allowInvalid, otomatik olarak imzalanan sertifikalar gibi geçersiz sertifikaların dikkate alınmalıdır.location, sertifikanın yükln olduğu depo konumu.serverCertificateX.509 sertifikasıdır.
Üretimde HTTPS'nin açıkça yapılandırılması gerekir. En azından, varsayılan bir sertifika sağlanmalıdır.
Bundan sonra açıklanan desteklenen yapılandırmalar:
- Yapılandırma yok
- Yapılandırmadan varsayılan sertifikayı değiştirme
- Kodda varsayılanları değiştirme
Yapılandırma yok
Kestrel ve http://localhost:5000 (varsayılan https://localhost:5001 bir sertifika varsa) dinler.
Yapılandırmadan varsayılan sertifikayı değiştirme
CreateDefaultBuilder varsayılan Configure(context.Configuration.GetSection("Kestrel")) olarak yük yapılandırmasına Kestrel çağrır. için varsayılan bir HTTPS uygulama ayarları yapılandırma şeması Kestrel mevcuttur. Disk veya sertifika depolama alanı üzerinde bulunan bir dosyadan, URL'ler ve kullanmak üzere sertifikalar dahil olmak üzere birden çok uç nokta yapılandırma.
Aşağıdaki appsettings.json örnekte:
- AllowInvalid'i geçersiz sertifikaların (örneğin, otomatik olarak imzalanan sertifikalar) kullanımına
trueizin verecek şekilde ayarlayın. - Sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte HttpsDefaultCert), Sertifikalar Varsayılan veya geliştirme sertifikası altında tanımlanan sertifikaya > geri döner.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
},
"HttpsInlineCertStore": {
"Url": "https://localhost:5002",
"Certificate": {
"Subject": "<subject; required>",
"Store": "<certificate store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
},
"HttpsDefaultCert": {
"Url": "https://localhost:5003"
},
"Https": {
"Url": "https://*:5004",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
},
"Certificates": {
"Default": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
Herhangi bir sertifika düğümü için Yol ve Parola kullanmanın alternatifi, sertifika depolama alanlarını kullanarak sertifikayı belirtmektir. Örneğin, Sertifikalar > Varsayılan sertifikası şu şekilde belirtilebilir:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Şema notları:
- Uç nokta adları büyük/büyük/büyük harfe duyarlı değildir. Örneğin,
HTTPSveHttpsgeçerlidir. - parametresi
Urlher 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 almaktadır. aracılığıyla kodda tanımlanan uçListennoktalar, yapılandırma bölümünde tanımlanan uç noktalarla biriktir. - bölümü
Certificateisteğe bağlıdır.CertificateBölüm belirtilmemişse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Kullanılabilir varsayılan değer yoksa, sunucu bir özel durum oluşturur ve başlayamaz. - Bu
Certificatebölüm hem yol – parolasını hem de Konu – deposu sertifikalarını destekler. - Herhangi bir sayıda uç nokta, bağlantı noktası çakışmalarına neden olmadıkları sürece bu şekilde tanımlanabilir.
options.Configure(context.Configuration.GetSection("{SECTION}"))yapılandırılmış birKestrelConfigurationLoader.Endpoint(string name, listenOptions => { })uç noktanın ayarlarını tamamlamak için kullanılabilecek bir yöntemi olan bir döndürür:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader , tarafından sağlana gibi var olan yükleyicisindeki yinelemeye devam etmek için doğrudan erişilebilir CreateDefaultBuilder .
- Her uç noktanın yapılandırma bölümü,
Endpointözel ayarların okunabilmesi için yöntemindeki seçeneklerde kullanılabilir. - Birden çok yapılandırma,
options.Configure(context.Configuration.GetSection("{SECTION}"))başka bir bölümle yeniden çağırarak yüklenebilir. Önceki örneklerde açıkça çağrılmadığı takdirde, yalnızca son yapılandırma kullanılırLoad. Metapackage,Loadvarsayılan yapılandırma bölümünün değiştirilmesini sağlayacak şekilde çağırmıyor. KestrelConfigurationLoader``ListenAPI ailesiniKestrelServerOptionsEndpointaşırı yükleme olarak yansıtır, bu nedenle kod ve yapılandırma uç noktaları aynı yerde yapılandırılabilir. Bu aşırı yüklemeler adları kullanmaz ve yalnızca yapılandırmadan varsayılan ayarları kullanır.
Koddaki varsayılanları değiştirme
ConfigureEndpointDefaults ve ConfigureHttpsDefaults ListenOptions HttpsConnectionAdapterOptions , önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma dahil, ve için varsayılan ayarları değiştirmek üzere kullanılabilir. ConfigureEndpointDefaults ve ConfigureHttpsDefaults herhangi bir uç nokta yapılandırılmadan önce çağrılmalıdır.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Kestrel SNı desteği
Sunucu adı belirtme (SNı) , aynı IP adresi ve bağlantı noktası üzerinde birden fazla etki alanını barındırmak için kullanılabilir. SNı 'nin çalışması için, istemci, TLS el sıkışması sırasında güvenli oturum ana bilgisayar adını, sunucunun doğru sertifikayı sağlayabilmesi için gönderir. İstemci, TLS anlaşmasını izleyen güvenli oturum sırasında sunucuyla şifreli iletişim için bulunan sertifikayı kullanır.
Kestrel geri çağırma aracılığıyla SNı 'yi destekler ServerCertificateSelector . Geri çağırma, uygulamanın ana bilgisayar adını incelemesine ve uygun sertifikayı seçmesini sağlamak için bağlantı başına bir kez çağrılır.
SNı desteği şunları gerektirir:
- Hedef Framework
netcoreapp2.1veya sonraki sürümlerde çalışıyor.net461Veya sonraki sürümlerde, geri çağırma çağrılır, ancaknameher zaman olurnull.nameAyrıca,nullISTEMCI, TLS el sıkışmasının ana bilgisayar adı parametresini sağlamıyorsa de olur. - Tüm Web siteleri aynı örnek üzerinde çalışır Kestrel . Kestrel , bir IP adresinin ve bağlantı noktasının bir ters proxy olmadan birden çok örnek arasında paylaşılmasını desteklemez.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var subExampleCert = CertificateLoader.LoadFromStoreCert(
"sub.example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var certs = new Dictionary<string, X509Certificate2>(
StringComparer.OrdinalIgnoreCase);
certs["localhost"] = localhostCert;
certs["example.com"] = exampleCert;
certs["sub.example.com"] = subExampleCert;
httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
{
if (name != null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
});
Bağlantı günlüğü
UseConnectionLoggingBir bağlantıda bayt düzeyinde iletişim Için hata ayıklama düzeyi günlüklerini yayma çağrısı. Bağlantı günlüğü, TLS şifreleme ve proxy 'nin arkasındaki gibi alt düzey iletişimde sorunları gidermeye yardımcı olur. UseConnectionLoggingDaha önce yerleştirilmişse UseHttps , şifrelenmiş trafik günlüğe kaydedilir. UseConnectionLoggingÖğesinden sonra yerleştirilmişse UseHttps , şifresi çözülmüş trafik günlüğe kaydedilir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
TCP yuvasına bağlama
ListenYöntemi BIR TCP yuvasına bağlanır ve bir seçenek lambda X. 509.440 sertifika yapılandırmasına izin verir:
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Örnek, HTTPS 'yi ile bir uç nokta için yapılandırır ListenOptions . Belirli uç noktalara yönelik diğer ayarları yapılandırmak için aynı API 'yi kullanın Kestrel .
Windows 'da, otomatik olarak imzalanan sertifikalar New-SelfSignedCertificate PowerShell cmdlet 'ikullanılarak oluşturulabilir. Desteklenmeyen bir örnek için bkz. UpdateIISExpressSSLForChrome.ps1.
MacOS, Linux ve Windows 'da, Sertifikalar OpenSSLkullanılarak oluşturulabilir.
UNIX yuvasına bağlama
ListenUnixSocketAşağıdaki örnekte gösterildiği gibi NGINX ile gelişmiş performans için ile birlikte bir UNIX yuvası dinleyin:
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock", listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testpassword");
});
});
- NGINX confiuguration dosyasında,
server>location>proxy_passgirdisini olarak ayarlayınhttp://unix:/tmp/{KESTREL SOCKET}:/;.{KESTREL SOCKET}, için belirtilen yuvanın adıdır ListenUnixSocket (örneğin,kestrel-test.sockÖnceki örnekte). - Yuvanın NGINX tarafından yazılabilir olduğundan emin olun (örneğin,
chmod go+w /tmp/kestrel-test.sock).
Bağlantı noktası 0
Bağlantı noktası numarası 0 belirtildiğinde, Kestrel dinamik olarak kullanılabilir bir bağlantı noktasına bağlanır. Aşağıdaki örnek, çalışma zamanında gerçekten hangi bağlantı noktasının bağlandığını nasıl belirleyeceğini göstermektedir Kestrel :
public void Configure(IApplicationBuilder app)
{
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
app.UseStaticFiles();
app.Run(async (context) =>
{
context.Response.ContentType = "text/html";
await context.Response
.WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
"<title></title></head><body><p>Hosted by Kestrel</p>");
if (serverAddressesFeature != null)
{
await context.Response
.WriteAsync("<p>Listening on the following addresses: " +
string.Join(", ", serverAddressesFeature.Addresses) +
"</p>");
}
await context.Response.WriteAsync("<p>Request URL: " +
$"{context.Request.GetDisplayUrl()}<p>");
});
}
Uygulama çalıştırıldığında konsol penceresi çıkışı, uygulamanın erişilebileceği dinamik bağlantı noktasını gösterir:
Listening on the following addresses: http://127.0.0.1:48508
Sınırlamalar
Aşağıdaki yaklaşımlar ile uç noktaları yapılandırın:
- UseUrls
--urlskomut satırı bağımsız değişkeniurlsAna bilgisayar yapılandırma anahtarıASPNETCORE_URLSortam değişkeni
Bu yöntemler, kodun dışındaki sunucularla kod çalışmasını sağlamak için yararlıdır Kestrel . Ancak, aşağıdaki sınırlamalara dikkat edin:
- HTTPS uç noktası yapılandırmasında varsayılan bir sertifika sağlanmadığı sürece HTTPS bu yaklaşımlar ile kullanılamaz (örneğin,
KestrelServerOptionsBu konunun önceki kısımlarında gösterildiği gibi yapılandırma veya yapılandırma dosyası kullanılıyor). - Hem hem de
ListenUseUrlsyaklaşımları aynı anda kullanıldığında, uç noktalarListenUseUrlsuç noktaları geçersiz kılar.
IIS uç nokta yapılandırması
IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya ya da tarafından ayarlanır Listen UseUrls . daha fazla bilgi için ASP.NET Core modülü konusuna bakın.
ListenOptions. Protocols
ProtocolsÖzelliği, HttpProtocols bir bağlantı uç noktasında veya sunucu IÇIN etkin HTTP protokollerini () belirler. ProtocolsSabit listesinden özelliğe bir değer atayın HttpProtocols .
HttpProtocols sabit listesi değeri |
Bağlantı protokolü izin verildi |
|---|---|
Http1 |
Yalnızca HTTP/1.1. , TLS olmadan veya ile kullanılabilir. |
Http2 |
Yalnızca HTTP/2. Yalnızca istemci önceki bir bilgi modunuDESTEKLIYORSA, TLS olmadan kullanılabilir. |
Http1AndHttp2 |
HTTP/1.1 ve HTTP/2. HTTP/2 bir TLS ve uygulama katmanı protokol anlaşması (ALPN) bağlantısı gerektirir; Aksi takdirde, bağlantı varsayılan olarak HTTP/1.1 ' dir. |
Varsayılan protokol HTTP/1.1 ' dir.
HTTP/2 için TLS kısıtlamaları:
- TLS sürüm 1,2 veya üzeri
- Yeniden anlaşma devre dışı
- Sıkıştırma devre dışı
- En az kısa ömürlü anahtar değişim boyutları:
- Eliptik Eğri Diffie-Hellman (ECDHE) [ RFC4492 ] : 224 bit minimum
- Sınırlı alan Diffie-Hellman (DHE) [
TLS12] : 2048 bit minimum
- Şifre paketi engellenmedi
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256[TLS-ECDHE] P-256 eliptik eğrisi [ FIPS186 ] Varsayılan olarak desteklenir.
Aşağıdaki örnek, 8000 numaralı bağlantı noktasında HTTP/1.1 ve HTTP/2 bağlantılarına izin verir. Bağlantılar, sağlanan bir sertifikayla TLS ile güvenlidir:
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
İsteğe bağlı olarak, IConnectionAdapter belirli şifrelemeler için bağlantı BAŞıNA TLS el sıkışmaları filtrelemek üzere bir uygulama oluşturun:
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
listenOptions.UseHttps("testCert.pfx", "testPassword");
listenOptions.ConnectionAdapters.Add(new TlsFilterAdapter());
});
});
private class TlsFilterAdapter : IConnectionAdapter
{
public bool IsHttps => false;
public Task<IAdaptedConnection> OnConnectionAsync(ConnectionAdapterContext context)
{
var tlsFeature = context.Features.Get<ITlsHandshakeFeature>();
// Throw NotSupportedException for any cipher algorithm that the app doesn't
// wish to support. Alternatively, define and compare
// ITlsHandshakeFeature.CipherAlgorithm to a list of acceptable cipher
// suites.
//
// No encryption is used with a CipherAlgorithmType.Null cipher algorithm.
if (tlsFeature.CipherAlgorithm == CipherAlgorithmType.Null)
{
throw new NotSupportedException("Prohibited cipher: " + tlsFeature.CipherAlgorithm);
}
return Task.FromResult<IAdaptedConnection>(new AdaptedConnection(context.ConnectionStream));
}
private class AdaptedConnection : IAdaptedConnection
{
public AdaptedConnection(Stream adaptedStream)
{
ConnectionStream = adaptedStream;
}
public Stream ConnectionStream { get; }
public void Dispose()
{
}
}
}
Protokolü yapılandırmadan ayarla
CreateDefaultBuilderserverOptions.Configure(context.Configuration.GetSection("Kestrel"))yapılandırmayı yüklemek için varsayılan olarak çağırır Kestrel .
Aşağıdaki appsettings.json örnekte, tüm uç noktaları için varsayılan bir bağlantı protokolü (http/1.1 ve http/2) oluşturulmuştur Kestrel :
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1AndHttp2"
}
}
}
Aşağıdaki yapılandırma dosyası örneği, belirli bir uç nokta için bağlantı protokolü oluşturur:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1AndHttp2"
}
}
}
}
Yapılandırma tarafından ayarlanan kod geçersiz kılma değerlerinde belirtilen protokoller.
Libuv aktarım yapılandırması
ASP.NET Core 2,1 ' nin yayınlanmasıyla birlikte, Kestrel varsayılan aktarım artık libuv ' d i temel değildir ancak bunun yerine yönetilen yuvaları temel alır. bu, çağrıyı yapan ve aşağıdaki paketlerden birine bağlı olan ASP.NET Core 2,0 2,1 uygulamalarının önemli bir değişikliği olur UseLibuv :
- Microsoft. AspNetCore. Server.Kestrel (doğrudan paket başvurusu)
- Microsoft.AspNetCore.App
Libuv kullanımını gerektiren projeler için:
-
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="{VERSION}" /> Çağrı UseLibuv :
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseLibuv() .UseStartup<Startup>(); }
URL önekleri
UseUrls, --urls Komut satırı bağımsız değişkeni, urls ana bilgisayar yapılandırma anahtarı veya ASPNETCORE_URLS ortam değişkeni kullanılırken, URL önekleri aşağıdaki biçimlerden birinde olabilir.
Yalnızca HTTP URL ön ekleri geçerlidir. Kestrel , kullanılarak URL bağlamaları yapılandırılırken HTTPS 'YI desteklemez UseUrls .
Bağlantı noktası numarası olan IPv4 adresi
http://65.55.39.10:80/0.0.0.0, tüm IPv4 adreslerine bağlanan özel bir durum değildir.Bağlantı noktası numarasına sahip IPv6 adresi
http://[0:0:0:0:0:ffff:4137:270a]:80/[::], IPv4'e eşdeğer olan IPv6'dır.0.0.0.0Bağlantı noktası numarası ile ana bilgisayar adı
http://contoso.com:80/ http://*:80/Konak adları
*, ve özel+değil. Geçerli bir IP adresi olarak tanınmaz veya tümlocalhostIPv4 ve IPv6 IP'lere bağlanabilir. Aynı bağlantı noktası üzerinde farklı ASP.NET Core ana bilgisayar adlarını bağlamak için iis, Nginx veya Apache HTTP.sys bir ters ara sunucu kullanın.Uyarı
Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.
Bağlantı
localhostnoktası numarasına veya bağlantı noktası numarasına sahip geri döngü IP'sini olan ana bilgisayar adıhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/localhostBelirtilirse, Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerini bağlamaya çalışır. İstenen bağlantı noktası herhangi bir geri döngü arabiriminde başka bir hizmet tarafından kullanıyorsa Kestrel başlatamaz. Herhangi bir geri döngü arabirimi başka bir nedenle kullanılamıyorsa (en yaygın olarak IPv6 desteklanmamaktadır), Kestrel bir uyarı günlüğe kaydeder.
Konak filtreleme
gibi Kestrel ön eklere göre yapılandırmayı http://example.com:5000 desteklerken, Kestrel ana bilgisayar adını büyük ölçüde yoksayar. Konak, localhost geri döngü adreslerine bağlama için kullanılan özel bir durum. Açık BIR IP adresi dışında herhangi bir konak tüm genel IP adreslerine bağlar. Host üst bilgiler doğrulanmaz.
Geçici bir çözüm olarak, Konak Filtreleme Ara Yazılımı'ı kullanın. Konak Filtreleme Ara Yazılımı, Microsoft.AspNetCore.App meta paketine (ASP.NET Core 2.1 veya 2.2) dahil edilen Microsoft.AspNetCore.HostFiltering paketi tarafından sağlanır. ara yazılımı tarafından eklenir CreateDefaultBuilder ve bu da çağrısında dır: AddHostFiltering
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Konak Filtreleme Ara Yazılımı varsayılan olarak devre dışıdır. Ara yazılımı etkinleştirmek için AllowedHosts appsettings.json / appsettings içinde bir anahtar tanımlayın. <EnvironmentName> . json. Değer, bağlantı noktası numaraları olmayan noktalı virgülle ayrılmış konak adları listesidir:
appsettings.json:
{
"AllowedHosts": "example.com;localhost"
}
Not
Iletili Üst Bilgiler Ara Yazılımı'nın da bir seçeneği AllowedHosts vardır. Iletili Üst Bilgiler Ara Yazılımı ve Konak Filtreleme Ara Yazılımı, farklı senaryolar için benzer işlevlere sahip olur. bir ters ara sunucu veya yük dengeleyici ile istekleri iletirken üst bilgi korunmazsa, Iletili Üst Bilgiler Ara Yazılımı AllowedHosts Host ayarı uygundur. Ana Bilgisayar Filtreleme Ara Yazılımı ayarı, genel olarak kullanılan uç sunucu olarak veya üst bilgi doğrudan AllowedHosts Kestrel Host iletildi olduğunda uygundur.
Iletili Üst Bilgiler Ara Yazılımı hakkında daha fazla bilgi için bkz. Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma .
HTTP/1.1 isteği boşaltma
HTTP bağlantılarının açılması zaman alır. HTTPS için de yoğun kaynak kullanır. Bu Kestrel nedenle, HTTP/1.1 protokolü başına bağlantıları yeniden kullanır. Bağlantının yeniden kullanılması için bir istek gövdesi tam olarak tüketilmelidir. Uygulama, sunucunun yeniden yönlendirme veya 404 yanıtı döndüren istekler gibi istek gövdesini her POST zaman tüketmez. POST-redirect durumunda:
- İstemci verilerin bir kısmını zaten göndermüş
POSTolabilir. - Sunucu 301 yanıtını yazar.
- Önceki istek gövdesinden veriler tam olarak okunana kadar
POSTbağlantı yeni bir istek için kullanılamaz. - Kestrel , istek gövdeyi boşaltmaya çalışır. İstek gövdeyi boşaltmak, verileri işlemeden okumak ve atmak anlamına gelir.
Boşaltma işlemi, bağlantının yeniden kullanılmasına izin verme ve kalan verileri boşaltma süresi arasında bir geçiş yapar:
- Boşaltmanın beş saniyelik zaman aşımı vardır ve bu zaman aşımı yapılandırılabilir değildir.
- Veya üst bilgisi tarafından belirtilen tüm veriler zaman aşımından önce
Content-LengthTransfer-Encodingokunmamışsa bağlantı kapatılır.
Bazen yanıtı yazmadan önce veya yazdıktan sonra isteği hemen sonlandırmak istiyor olabilir. Örneğin, istemciler kısıtlayıcı veri sınırlara sahip olabilir, dolayısıyla karşıya yüklenen verileri sınırlamak bir öncelik olabilir. Böyle durumlarda bir isteği sonlandırmak için denetleyiciden, Sayfadan veya ara yazılımdan HttpContext.Abort Razor çağrısında bulunabilirsiniz.
çağrısında uyarılar Abort vardır:
- Yeni bağlantılar oluşturmak yavaş ve pahalı olabilir.
- Bağlantı kapanmadan önce istemcinin yanıtı okuduğu garanti edilemez.
- Arama
Abortnadir olmalı ve sık karşılaşılan hatalar için değil ciddi hata durumlarına ayrılmıştır.- Yalnızca belirli
Abortbir sorunun çözülmesi gerekirken çağrısı. Örneğin, kötü amaçlı istemciler verileri almaya çalışıyorsa veya istemci kodunda büyük veya çok sayıda i isteğine neden olan bir hataAbortPOSTolduğunda çağrısı. AbortHTTP 404 (Bulunamadı) gibi yaygın hata durumlarını çağırmayın.
- Yalnızca belirli
Çağırmadan önce HttpResponse.CompleteAsync çağrısı Abort yapılması, sunucunun yanıtı yazmayı tamamlamış olması sağlar. Ancak istemci davranışı tahmin edilebilir değildir ve bağlantı durdurulmadan önce yanıtı okuyamaz.
Protokol, bağlantıyı kapatmadan tek tek istek akışlarını durdurmayı desteklediği için bu işlem HTTP/2 için farklıdır. Beş saniyelik boşaltma zaman aşımı geçerli değildir. Yanıt tamamladıktan sonra okunmamış istek gövdesi verileri varsa sunucu bir HTTP/2 RST çerçevesi gönderir. Ek istek gövdesi veri çerçeveleri yoksayılır.
Mümkünse, istemcilerin Expect: 100-continue istek üst bilgisinden faydalanmaları ve istek gövdelerini göndermeye başlamadan önce sunucunun yanıt vermelerini beklemeleri daha iyidir. Bu, istemciye, gerekmeden veri göndermeden önce yanıtı inceleme ve durdurma fırsatı verir.
Ek kaynaklar
- Linux'UNIX yuvaları kullanırken yuva, uygulama kapatılırken otomatik olarak silinmez. Daha fazla bilgi için bu soruna GitHub bakın.
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core 'de HTTPS 'yi zorla
- Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma
- RFC 7230: İleti Söz Dizimi ve Yönlendirme (Bölüm 5.4: Konak)
Kestrel, için platformlar arası bir web ASP.NET Core. Kestrel, proje şablonlarına varsayılan olarak dahil ASP.NET Core sunucusudur.
Kestrel aşağıdaki senaryoları destekler:
- HTTPS
- WebSockets'i etkinleştirmek için kullanılan opak yükseltme
- Nginx'in arkasında yüksek performans için Unix yuvaları
Kestrel , .NET Core'un desteklediği tüm platformlarda ve sürümlerde de desteklemektedir.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Ters ara sunucu Kestrel ile ne zaman kullanmalı?
Kestreltek başına veya Internet Information Services (IIS) , Nginxveya Apache gibi bir ters proxy sunucusu ile kullanılabilir. Ters ara sunucu, ağdan HTTP isteklerini alır ve bu istekleri adresine Kestrel iletir.
Kestrel uç (İnternet'e yönelik) web sunucusu olarak kullanılır:

Kestrel ters ara sunucu 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ılır, aynı IP ve bağlantı noktasının birden çok işlem arasında paylaşımını desteklemez. Bir bağlantı noktasını dinleyecek şekilde yapılandırıldığında, isteklerin üst bilgilerden bağımsız olarak bu Kestrel bağlantı noktası için tüm trafiği Kestrel Host işler. Bağlantı noktalarını paylaştıran bir ters ara sunucu, istekleri benzersiz bir IP ve Kestrel bağlantı noktası üzerinde adresine iletebilir.
Ters ara sunucu gerekli değilse bile, ters ara sunucu kullanmak iyi bir seçenek olabilir.
Ters ara sunucu:
- Barındır olduğu uygulamaların açık genel yüzey alanı sınırlayıcı olabilir.
- Ek bir yapılandırma ve savunma katmanı sağlama.
- Var olan altyapıyla daha iyi tümleştiri olabilir.
- Yük dengelemeyi ve güvenli iletişim (HTTPS) yapılandırmasını basitleştirin. Yalnızca ters ara sunucu bir X.509 sertifikası gerektirir ve bu sunucu, düz HTTP kullanarak iç ağ üzerinde uygulamanın sunucularıyla iletişim kurabilir.
Uyarı
Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.
Uygulama Kestrel uygulamalarında ASP.NET Core kullanma
Microsoft.AspNetCore.Server. Kestrel paketi, meta Microsoft.AspNetCore.App dahil edilir.
ASP.NET Core proje şablonları varsayılan Kestrel olarak kullanılır. Program.cs'de şablon CreateDefaultBuilder kodu, arka sahneyi UseKestrel çağıran çağrısında bulundu.
çağrısından sonra ek yapılandırma sağlamak CreateDefaultBuilder için çağrısında UseKestrel arayın:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
// Set properties and call methods on serverOptions
});
Konak hakkında daha CreateDefaultBuilder fazla bilgi için, 'nin Konak ayarlama bölümüne ASP.NET Core Web ana bilgisayarı bakın.
Kestrel Seçenekler
Web Kestrel sunucusunun, özellikle İnternet'e yönelik dağıtımlarda yararlı olan kısıtlama yapılandırma seçenekleri vardır.
sınıfının özelliği Limits üzerinde kısıtlamalar KestrelServerOptions ayarlayın. Limitsözelliği sınıfının bir örneğini KestrelServerLimits tutar.
Aşağıdaki örneklerde ad alanı Microsoft.AspNetCore.Server.Kestrel.Core kullanılır:
using Microsoft.AspNetCore.Server.Kestrel.Core;
Kestrelaşağıdaki örneklerde C# kodunda yapılandırılan seçenekler, bir yapılandırma sağlayıcısı kullanılarak da ayarlandırabilirsiniz. Örneğin, Dosya Yapılandırma Sağlayıcısı bir veya Kestrel appsettings.json appsettings'den yapılandırmayı yükleyemedi.{ Environment}.json dosyası:
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
}
}
}
Aşağıdaki yaklaşımlardan birini kullanın:
içinde Kestrel
Startup.ConfigureServicesyapılandırma:sınıfına bir
IConfigurationörneğiStartupekleme. Aşağıdaki örnekte, özelliğine yeni yapılandırmanın atandığıConfigurationvarsayıldı.içinde,
Startup.ConfigureServicesyapılandırmaKestrelbölümünü Kestrel 'nin yapılandırmasına yükleme:using Microsoft.Extensions.Configuration public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.Configure<KestrelServerOptions>( Configuration.GetSection("Kestrel")); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { ... } }
Konak Kestrel yapılandırılırken yapılandırma:
Program.cs içinde, yapılandırma
Kestrelbölümünü Kestrel 'nin yapılandırmasına yükleme:// using Microsoft.Extensions.DependencyInjection; public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { services.Configure<KestrelServerOptions>( context.Configuration.GetSection("Kestrel")); }) .UseStartup<Startup>();
Yukarıdaki yaklaşımların her ikisi de herhangi bir yapılandırma sağlayıcısı ile çalışır.
Canlı tutma zaman aşımı
Keep-alive zaman aşımını alır veya ayarlar. Varsayılan değer 2 dakikadır.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
});
En fazla istemci bağlantısı
MaxConcurrentConnections MaxConcurrentUpgradedConnections
Uygulamanın tamamı için en fazla eş zamanlı açık TCP bağlantısı sayısı aşağıdaki kodla ayarlanabilir:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentConnections = 100;
});
HTTP veya HTTPS'den başka bir protokole (örneğin, Bir WebSockets isteği üzerinde) yükseltilen bağlantılar için ayrı bir sınır vardır. Bağlantı yükseltildikten sonra sınıra göre MaxConcurrentConnections sayılmaz.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Limits.MaxConcurrentUpgradedConnections = 100;
});
En fazla bağlantı sayısı varsayılan olarak sınırsızdır (null).
En büyük istek gövdesi boyutu
Varsayılan en yüksek istek gövdesi boyutu 30.000.000 bayttır ve bu da yaklaşık 28,6 MB'tır.
Bir MVC uygulamasında sınırı geçersiz kılmak ASP.NET Core yaklaşım, özniteliğini bir eylem RequestSizeLimitAttribute yönteminde kullanmaktır:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Her istekte uygulama kısıtlamasını yapılandırmayı gösteren bir örnek:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Limits.MaxRequestBodySize = 10 * 1024;
});
Ara yazılımda belirli bir istekte ayarı geçersiz kılın:
app.Run(async (context) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var minRequestRateFeature =
context.Features.Get<IHttpMinRequestBodyDataRateFeature>();
var minResponseRateFeature =
context.Features.Get<IHttpMinResponseDataRateFeature>();
if (minRequestRateFeature != null)
{
minRequestRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
if (minResponseRateFeature != null)
{
minResponseRateFeature.MinDataRate = new MinDataRate(
bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
}
Uygulama isteği okumaya başladıktan sonra istekte sınırı yapılandırıyorsa bir özel durum oluşturur. Özelliğin salt okunur durumda olup olduğunu belirten bir özellik IsReadOnly vardır. Bu, sınırın yapılandırılması için çok MaxRequestBodySize geç olduğu anlamına gelir.
Bir uygulama, ASP.NET Core Modülü'ASP.NET Core işlem dışı bırakılmıştır çünküIIS zaten sınırı Kestrel ayarlar.
En düşük istek gövdesi veri hızı
MinRequestBodyDataRate MinResponseDataRate
Kestrel veriler bayt/saniye cinsinden belirtilen hıza geliyorsa her saniye denetler. Hız en düşük değere düşerse bağlantı zaman out olur. Yetkisiz kullanım süresi, istemciye gönderme oranını en düşük değere kadar artırmasını veren süredir; bu süre Kestrel boyunca hız denetlenir. Yetkisiz kullanım süresi, TCP'nin yavaş başlaması nedeniyle başlangıçta veri gönderen bağlantıların yavaş bir şekilde bırakılmasından kaçınmaya yardımcı olur.
Varsayılan minimum hız, 5 saniye yetkisiz kullanım süresiyle 240 bayt/saniyedir.
Yanıt için de bir minimum hız geçerlidir. İstek sınırını ve yanıt sınırını ayarlamaya yönelik kod, özellik ve arabirim adlarında veya olması RequestBody Response dışında aynıdır.
Program.cs'de en düşük veri oranlarının nasıl yapılandırıldığından emin olmak için aşağıdaki örneği kullanın:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Limits.MinRequestBodyDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
serverOptions.Limits.MinResponseDataRate =
new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10));
});
İstek üst bilgileri zaman aşımı
Sunucunun istek üst bilgilerini almak için harcadığı maksimum zamanı alır veya ayarlar. Varsayılan olarak 30 saniyedir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
});
Zaman Uyumlu G/Ç
AllowSynchronousIO , istek ve yanıt için zaman uyumlu I/O'ya izin verili olup olmadığını kontrol eder. Varsayılan değer: true .
Uyarı
Çok sayıda engelleme zaman uyumlu I/O işlemleri, iş parçacığı havuzu açlıklarına neden olabilir ve bu da uygulamanın yanıt vermemeye neden olur. Yalnızca AllowSynchronousIO zaman uyumsuz I/O'yi desteklemez bir kitaplık kullanırken etkinleştirin.
Aşağıdaki örnek zaman uyumlu I/O'yi devre dışı bırakıyor:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = false;
});
Diğer seçenekler ve sınırlar Kestrel hakkında bilgi için bkz:
Uç nokta yapılandırması
Varsayılan olarak, ASP.NET Core şu bağlantılara bağlanıyor:
http://localhost:5000https://localhost:5001(yerel bir geliştirme sertifikası mevcut olduğunda)
Şu url'leri kullanarak URL'leri belirtin:
ASPNETCORE_URLSortam değişkeni.--urlskomut satırı bağımsız değişkeni.urlskonak yapılandırma anahtarı.UseUrlsextension yöntemi.
Bu yaklaşımlar kullanılarak sağlanan değer bir veya daha fazla HTTP ve HTTPS uç noktası (varsayılan sertifika varsa HTTPS) olabilir. Değeri noktalı virgülle ayrılmış liste (örneğin, ) olarak "Urls": "http://localhost:8000;http://localhost:8001" yapılandırma.
Bu yaklaşımlar hakkında daha fazla bilgi için bkz. Sunucu URL'leri ve Geçersiz Kılma yapılandırması.
Bir geliştirme sertifikası oluşturulur:
- Uygulama .NET Core SDK yüklenir.
- Bir sertifika oluşturmak için dev-certs aracı kullanılır.
Bazı tarayıcıların yerel geliştirme sertifikasına güvenmesi için açık izin verilmesi gerekir.
Project şablonları, uygulamaları varsayılan olarak HTTPS üzerinde çalıştıracak şekilde yapılandırarak HTTPS yeniden yönlendirme ve HSTS desteği içerir.
url Listen ön ListenUnixSocket eklerini ve bağlantı noktalarını yapılandırmak için çağrısı KestrelServerOptions veya Kestrel yöntemleri.
UseUrls, komut satırı bağımsız değişkeni, konak yapılandırma anahtarı ve ortam değişkeni de çalışır, ancak bu bölümün ilerleyen kısımlarında (HTTPS uç noktası yapılandırması için varsayılan sertifikanın kullanılabilir olması --urls urls ASPNETCORE_URLS gerekir) sınırlamalara sahiptir.
KestrelServerOptions Yapılandırma:
ConfigureEndpointDefaults(Eylem <ListenOptions> )
Belirtilen her uç nokta Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureEndpointDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Not
Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureEndpointDefaults uç noktaların varsayılan değerleri uygulanmaz.
ConfigureHttpsDefaults(Eylem <HttpsConnectionAdapterOptions> )
Her HTTPS uç noktası Action için çalıştıracak bir yapılandırma belirtir. Birden ConfigureHttpsDefaults çok kez çağrılarak Action öncekiler son belirtilenle Action değiştirilir.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureKestrel((context, serverOptions) =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Not
Çağrılmadan önce Listen çağrılarak oluşturulan ConfigureHttpsDefaults uç noktaların varsayılan değerleri uygulanmaz.
Configure(IConfiguration)
Giriş olarak alan bir ayar için Kestrel bir yapılandırma IConfiguration yükleyicisi oluşturur. Yapılandırmanın kapsamı için yapılandırma bölümü olarak Kestrel genişletildi.
ListenOptions.UseHttps
KestrelHTTPS kullanmak için yapılandırma.
ListenOptions.UseHttps Uzantı -ları:
UseHttps: Varsayılan Kestrel sertifika ile HTTPS kullanmak üzere yapılandırma. Varsayılan sertifika yapılandırılmamışsa bir özel durum oluşturur.UseHttps(string fileName)UseHttps(string fileName, string password)UseHttps(string fileName, string password, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(StoreName storeName, string subject)UseHttps(StoreName storeName, string subject, bool allowInvalid)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location)UseHttps(StoreName storeName, string subject, bool allowInvalid, StoreLocation location, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(X509Certificate2 serverCertificate)UseHttps(X509Certificate2 serverCertificate, Action<HttpsConnectionAdapterOptions> configureOptions)UseHttps(Action<HttpsConnectionAdapterOptions> configureOptions)
ListenOptions.UseHttps Parametre:
filename, uygulamanın içerik dosyalarını içeren dizine göre bir sertifika dosyasının yolu ve dosya adıdır.password, X.509 sertifika verilerine erişmek için gereken paroladır.configureOptions, yapılandırmakActioniçin bir 'dır.HttpsConnectionAdapterOptionsdöndürür.ListenOptionsstoreName, sertifikanın yükln olduğu sertifika deposu.subject, sertifikanın konu adıdır.allowInvalid, otomatik olarak imzalanan sertifikalar gibi geçersiz sertifikaların dikkate alınmalıdır.location, sertifikanın yükln olduğu depo konumu.serverCertificateX.509 sertifikasıdır.
Üretimde HTTPS'nin açıkça yapılandırılması gerekir. En azından, varsayılan bir sertifika sağlanmalıdır.
Bundan sonra açıklanan desteklenen yapılandırmalar:
- Yapılandırma yok
- Yapılandırmadan varsayılan sertifikayı değiştirme
- Kodda varsayılanları değiştirme
Yapılandırma yok
Kestrel ve http://localhost:5000 (varsayılan https://localhost:5001 bir sertifika varsa) dinler.
Yapılandırmadan varsayılan sertifikayı değiştirme
CreateDefaultBuilder varsayılan Configure(context.Configuration.GetSection("Kestrel")) olarak yük yapılandırmasına Kestrel çağrır. için varsayılan bir HTTPS uygulama ayarları yapılandırma şeması Kestrel mevcuttur. Disk veya sertifika depolama alanı üzerinde bulunan bir dosyadan, URL'ler ve kullanmak üzere sertifikalar dahil olmak üzere birden çok uç nokta yapılandırma.
Aşağıdaki appsettings.json örnekte:
- AllowInvalid'i geçersiz sertifikaların (örneğin, otomatik olarak imzalanan sertifikalar) kullanımına
trueizin verecek şekilde ayarlayın. - Sertifika belirtmeyen herhangi bir HTTPS uç noktası (aşağıdaki örnekte HttpsDefaultCert), Sertifikalar Varsayılan veya geliştirme sertifikası altında tanımlanan sertifikaya > geri döner.
{
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:5000"
},
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
},
"HttpsInlineCertStore": {
"Url": "https://localhost:5002",
"Certificate": {
"Subject": "<subject; required>",
"Store": "<certificate store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
},
"HttpsDefaultCert": {
"Url": "https://localhost:5003"
},
"Https": {
"Url": "https://*:5004",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
},
"Certificates": {
"Default": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
Herhangi bir sertifika düğümü için Yol ve Parola kullanmanın alternatifi, sertifika depolama alanlarını kullanarak sertifikayı belirtmektir. Örneğin, Sertifikalar > Varsayılan sertifikası şu şekilde belirtilebilir:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Şema notları:
- Uç nokta adları büyük/büyük/büyük harfe duyarlı değildir. Örneğin,
HTTPSveHttpsgeçerlidir. - parametresi
Urlher uç nokta için gereklidir. Bu parametrenin biçimi, tek bir değerle sınırlı olması dışında üstUrlsdüzey yapılandırma parametresiyle aynıdır. - Bu uç noktalar, bunlara eklemek yerine üst düzey
Urlsyapılandırmada tanımlananların yerini almaktadır. aracılığıyla kodda tanımlanan uçListennoktalar, yapılandırma bölümünde tanımlanan uç noktalarla biriktir. - bölümü
Certificateisteğe bağlıdır. BölümüCertificatebelirtilmezse, önceki senaryolarda tanımlanan varsayılanlar kullanılır. Varsayılan değer yoksa sunucu bir özel durum oluşturur ve başlatamaz. - bölümü
Certificatehem Yol Parolası hem – de Konu Deposu – sertifikalarını destekler. - Bağlantı noktası çakışmaları neden olmayacak şekilde herhangi bir sayıda uç nokta bu şekilde tanımlanabilir.
options.Configure(context.Configuration.GetSection("{SECTION}")),KestrelConfigurationLoaderyapılandırılan.Endpoint(string name, listenOptions => { })uç noktanın ayarlarını tamamlarken kullanılan bir yöntemi ile döndürür:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader tarafından sağlanan yükleyici gibi mevcut yükleyicide tekrar çalışmaya devam etmek için doğrudan CreateDefaultBuilder erişilebilir.
- Her uç noktanın yapılandırma bölümü, özel ayarların
Endpointokunmalarını için yönteminde bulunan seçeneklerde kullanılabilir. - Başka bir bölümle yeniden çağrılarak
options.Configure(context.Configuration.GetSection("{SECTION}"))birden çok yapılandırma yüklenebilir. Önceki örneklerde açıkçaLoadçağrılmadıkça yalnızca son yapılandırma kullanılır. Meta paket, varsayılan yapılandırmaLoadbölümünün değiştirilene kadar çağrısız. KestrelConfigurationLoader, API ailesini aşırı yüklemeler olarak yansıtarak kod ve yapılandırma uçListenKestrelServerOptionsEndpointnoktalarının aynı yerde yapılandırılamalarını sağlar. Bu aşırı yüklemeler adları kullanmaz ve yalnızca yapılandırmadan varsayılan ayarları kullanır.
Kodda varsayılanları değiştirme
ConfigureEndpointDefaults ve , önceki senaryoda belirtilen varsayılan sertifikayı geçersiz kılma da dahil olmak üzere ve ConfigureHttpsDefaults için varsayılan ayarları değiştirmek için ListenOptions HttpsConnectionAdapterOptions kullanılabilir. ConfigureEndpointDefaults ve ConfigureHttpsDefaults herhangi bir uç nokta yapılandırılmadan önce çağrılmış olmalıdır.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel((context, serverOptions) =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Kestrel SNI desteği
Sunucu Adı Belirtme (SNI), aynı IP adresi ve bağlantı noktası üzerinde birden çok etki alanı barındırmak için kullanılabilir. SNI'nin çalışması için istemci, güvenli oturum için ana bilgisayar adını TLS el sıkışması sırasında sunucuya gönderir, böylece sunucu doğru sertifikayı sağlar. İstemci, TLS el sıkışmasını izleyen güvenli oturum sırasında sunucuyla şifreli iletişim için sertifikayı kullanır.
Kestrel geri çağırma aracılığıyla ServerCertificateSelector SNI'yi destekler. Uygulamanın konak adını incelemesine ve uygun sertifikayı seçmesine izin vermek için bağlantı başına bir kez geri çağırma çağrılır.
SNI desteği şunları gerektirir:
- Hedef çerçevede veya
netcoreapp2.1daha sonraki bir üzerinde çalışıyor. veyanet461sonraki bir zamanda, geri çağırma çağrılır ancak her zamannamenullolur.nameayrıca istemci TLS el sıkışması içinde ana bilgisayar adınullparametresini sağlamazsa da olur. - Tüm web siteleri aynı örnekte Kestrel çalıştır. Kestrel bir IP adresinin ve bağlantı noktasının ters ara sunucu olmadan birden çok örnek arasında paylaşımını desteklemez.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel((context, serverOptions) =>
{
serverOptions.ListenAnyIP(5005, listenOptions =>
{
listenOptions.UseHttps(httpsOptions =>
{
var localhostCert = CertificateLoader.LoadFromStoreCert(
"localhost", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var exampleCert = CertificateLoader.LoadFromStoreCert(
"example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var subExampleCert = CertificateLoader.LoadFromStoreCert(
"sub.example.com", "My", StoreLocation.CurrentUser,
allowInvalid: true);
var certs = new Dictionary<string, X509Certificate2>(
StringComparer.OrdinalIgnoreCase);
certs["localhost"] = localhostCert;
certs["example.com"] = exampleCert;
certs["sub.example.com"] = subExampleCert;
httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
{
if (name != null && certs.TryGetValue(name, out var cert))
{
return cert;
}
return exampleCert;
};
});
});
})
.Build();
Bağlantı günlüğü
Bağlantıda UseConnectionLogging bayt düzeyinde iletişim için Hata Ayıklama düzeyi günlüklerini yayın. Bağlantı günlüğü, TLS şifrelemesi sırasında ve aracıların arkasında olduğu gibi alt düzey iletişim sorunlarını gidermeye yardımcı olur. ' UseConnectionLogging den önce UseHttps yerleştirilirse, şifrelenmiş trafik günlüğe kaydedilir. 'den UseConnectionLogging sonra UseHttps yerleştirilirse şifresi çözülen trafik günlüğe kaydedilir.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
TCP yuvasına bağlama
yöntemi Listen bir TCP yuvasına bağlar ve lambda seçenekleri X.509 sertifika yapılandırmasına izin sağlar:
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Loopback, 5000);
serverOptions.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
Örnek, ile bir uç nokta için HTTPS'yi ListenOptions yapılandırmaktadır. Belirli uç noktaların diğer ayarlarını yapılandırmak Kestrel için aynı API'yi kullanın.
Windows 'da, otomatik olarak imzalanan sertifikalar New-SelfSignedCertificate PowerShell cmdlet 'ikullanılarak oluşturulabilir. Desteklenmeyen bir örnek için bkz. UpdateIISExpressSSLForChrome.ps1.
MacOS, Linux ve Windows 'da, Sertifikalar OpenSSLkullanılarak oluşturulabilir.
Unix yuvasına bağlama
Bu örnekte gösterildiği gibi Nginx ile daha iyi performans için ile bir Unix ListenUnixSocket yuvasında dinleme:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock", listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testpassword");
});
});
- Nginxuguuguration dosyasında girdisini
server>location>proxy_passolarakhttp://unix:/tmp/{KESTREL SOCKET}:/;ayarlayın.{KESTREL SOCKET}, için sağlanan yuvanın ListenUnixSocket adıdır (örneğin,kestrel-test.sockönceki örnekte). - Yuvanın Nginx tarafından yazılabilir olduğundan emin olun (örneğin,
chmod go+w /tmp/kestrel-test.sock).
Bağlantı noktası 0
Bağlantı noktası numarası 0 belirtilirse, Kestrel kullanılabilir bir bağlantı noktasına dinamik olarak bağlar. Aşağıdaki örnek, çalışma zamanında gerçekten bağlı olan bağlantı Kestrel noktasının nasıl belirleneceklerini gösterir:
public void Configure(IApplicationBuilder app)
{
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
app.UseStaticFiles();
app.Run(async (context) =>
{
context.Response.ContentType = "text/html";
await context.Response
.WriteAsync("<!DOCTYPE html><html lang=\"en\"><head>" +
"<title></title></head><body><p>Hosted by Kestrel</p>");
if (serverAddressesFeature != null)
{
await context.Response
.WriteAsync("<p>Listening on the following addresses: " +
string.Join(", ", serverAddressesFeature.Addresses) +
"</p>");
}
await context.Response.WriteAsync("<p>Request URL: " +
$"{context.Request.GetDisplayUrl()}<p>");
});
}
Uygulama çalıştırıldı mı, konsol penceresi çıkışı uygulamaya ulaşılanın dinamik bağlantı noktasını gösterir:
Listening on the following addresses: http://127.0.0.1:48508
Sınırlamalar
Uç noktaları aşağıdaki yaklaşımlarla yapılandırma:
- UseUrls
--urlskomut satırı bağımsız değişkeniurlskonak yapılandırma anahtarıASPNETCORE_URLSortam değişkeni
Bu yöntemler, kodun dışında sunucularla çalışması için Kestrel yararlıdır. Ancak, aşağıdaki sınırlamalara dikkat edin:
- HTTPS uç noktası yapılandırmasında varsayılan bir sertifika sağlanıyorsa (örneğin, bu konuda daha önce gösterildiği gibi yapılandırma veya yapılandırma dosyası kullanarak) HTTPS bu yaklaşımlarla
KestrelServerOptionskullanılamaz. - Hem hem de
ListenUseUrlsyaklaşımları aynı anda kullanılırsa, uçListennoktalar uç noktaları geçersizUseUrlskılar.
IIS uç nokta yapılandırması
IIS kullanırken, IIS geçersiz kılma bağlamaları için URL bağlamaları veya tarafından Listen UseUrls ayarlanır. Daha fazla bilgi için ASP.NET Core Modülü konu başlığına bakın.
Libuv aktarım yapılandırması
ASP.NET Core 2.1'in sürümüyle, 'nin varsayılan taşıması artık Libuv'a değil, yönetilen Kestrel yuvalara dayalıdır. Bu, 2.0 ASP.NET Core çağıran ve aşağıdaki paketlerden herhangi birini temel alan 2.1 sürümüne yükselten uygulamalar için UseLibuv yeni bir değişikliktir:
- Microsoft.AspNetCore.Server.Kestrel (doğrudan paket başvurusu)
- Microsoft.AspNetCore.App
Libuv kullanımını gerektiren projeler için:
-
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="{VERSION}" /> UseLibuvÇağrısı:
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseLibuv() .UseStartup<Startup>(); }
URL ön ekleri
, UseUrls komut --urls satırı bağımsız değişkeni, konak yapılandırma anahtarı veya ortam değişkeni kullanılırken, URL ön urls ASPNETCORE_URLS ekleri aşağıdaki biçimlerden herhangi biri olabilir.
Yalnızca HTTP URL ön ekleri geçerlidir. Kestrel kullanarak URL bağlamalarını yapılandırarak HTTPS'yi UseUrls desteklemez.
Bağlantı noktası numarasına sahip IPv4 adresi
http://65.55.39.10:80/0.0.0.0, tüm IPv4 adreslerine bağlanan özel bir durum değildir.Bağlantı noktası numarasına sahip IPv6 adresi
http://[0:0:0:0:0:ffff:4137:270a]:80/[::], IPv4'e eşdeğer olan IPv6'dır.0.0.0.0Bağlantı noktası numarası ile ana bilgisayar adı
http://contoso.com:80/ http://*:80/Konak adları
*, ve özel+değil. Geçerli bir IP adresi olarak tanınmaz veya tümlocalhostIPv4 ve IPv6 IP'lere bağlanabilir. Aynı bağlantı noktası üzerinde farklı konak ASP.NET Core uygulamalarına bağlamak için IIS, Nginx veya Apache HTTP.sys bir ters ara sunucu kullanın.Uyarı
Ters ara sunucu yapılandırmasında barındırmak için, Iletili Üst Bilgiler Ara Yazılımı yapılandırması gerekir.
Bağlantı
localhostnoktası numarasına veya bağlantı noktası numarasına sahip geri döngü IP'sini olan ana bilgisayar adıhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/localhostBelirtilirse, Kestrel hem IPv4 hem de IPv6 geri döngü arabirimlerini bağlamaya çalışır. İstenen bağlantı noktası herhangi bir geri döngü arabiriminde başka bir hizmet tarafından kullanıyorsa Kestrel başlatamaz. Herhangi bir geri döngü arabirimi başka bir nedenle kullanılamıyorsa (genellikle IPv6 desteklenmediği için), Kestrel bir uyarı kaydeder.
Konak filtreleme
Kestrel, Gibi önekleri temel alarak yapılandırmayı desteklerken http://example.com:5000 , büyük Kestrel ölçüde ana bilgisayar adını yoksayar. Ana bilgisayar localhost , geri döngü adreslerine bağlama için kullanılan özel bir durumdur. Açık IP adresi dışındaki tüm ana bilgisayar tüm genel IP adreslerine bağlanır. Host Üstbilgiler doğrulanmadı.
Geçici bir çözüm olarak, ana bilgisayar filtreleme ara yazılımı kullanın. ana bilgisayar filtreleme ara yazılımı, Microsoft.AspNetCore.App metapackage (ASP.NET Core 2,1 veya 2,2) içinde yer alan Microsoft. aspnetcore. hostfiltering paketi tarafından sağlanır. Ara yazılım tarafından eklenir CreateDefaultBuilder ve şunları çağırır AddHostFiltering :
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
Ana bilgisayar filtreleme ara yazılımı varsayılan olarak devre dışıdır. Ara yazılımı etkinleştirmek için AllowedHosts appSettings 'de bir anahtar tanımlayın appsettings.json / . <EnvironmentName> . JSON. Değer, bağlantı noktası numaraları olmayan ana bilgisayar adlarının noktalı virgülle ayrılmış listesidir:
appsettings.json:
{
"AllowedHosts": "example.com;localhost"
}
Not
Iletilen üstbilgiler ara yazılımı da bir AllowedHosts seçenek içerir. İletilen üstbilgiler ara yazılımı ve ana bilgisayar filtreleme ara yazılımı, farklı senaryolar için benzer işlevlere sahiptir. AllowedHostsIletilen üstbilgiler ara yazılımı ile, Host istekler ters bir ara sunucu veya yük dengeleyici ile iletilirken üst bilgi korunurken, bu işlem için uygun bir ayar vardır. AllowedHostsAna bilgisayar filtreleme ara yazılımı ile ayarlandığında, Kestrel genel kullanıma yönelik bir uç sunucu olarak veya Host üst bilgi doğrudan iletildiğinde kullanılır.
Iletilen üstbilgiler ara yazılımı hakkında daha fazla bilgi için bkz Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma ..
HTTP/1.1 istek boşaltma
HTTP bağlantılarının açılması zaman alabilir. HTTPS için de kaynak kullanımı yoğun bir işlemdir. Bu nedenle, Kestrel http/1.1 protokolü başına bağlantıları yeniden kullanmaya çalışır. Bağlantının yeniden kullanılmasına izin vermek için bir istek gövdesi tam olarak tüketilmelidir. Uygulama, POST sunucunun yeniden yönlendirme veya 404 yanıtı döndürdüğü bir istek gibi her zaman istek gövdesini tüketmez. POSTYeniden yönlendirme durumunda:
- İstemci, verilerin bir bölümünü zaten göndermiş olabilir
POST. - Sunucu 301 yanıtını yazar.
POSTÖnceki istek gövdesinden gelen veriler tam olarak okunana kadar bağlantı yeni bir istek için kullanılamaz.- Kestrel istek gövdesini boşaltmaya çalışır. İstek gövdesini boşaltma işlemi işlemeden verileri okuma ve atma anlamına gelir.
Boşaltma işlemi bağlantının yeniden kullanılmasına izin verme ve kalan verilerin boşaltıma süresi arasında bir ilerleme gerçekleştirir:
- Boşaltma, yapılandırılabilir olmayan beş saniyelik bir zaman aşımına sahip olur.
- Veya üstbilgisi tarafından belirtilen tüm veriler
Content-LengthTransfer-Encodingzaman aşımından önce okunmadıysa bağlantı kapatılır.
Bazen, yanıtı yazmadan önce veya sonra isteği hemen sonlandırmak isteyebilirsiniz. Örneğin, istemciler sınırlı verilerin büyük bir düzeyi olabilir, bu nedenle karşıya yüklenen verileri sınırlamak bir öncelik olabilir. Bu tür durumlarda bir isteği sonlandırmak için bir denetleyici, sayfa veya ara yazılım aracılığıyla HttpContext. Abort ' ı çağırın Razor .
Çağırmanın uyarıları vardır Abort :
- Yeni bağlantı oluşturma yavaş ve pahalı olabilir.
- İstemcinin bağlantı kapanmadan önce yanıtı okuduğunuzdan emin olmaz.
- Çağırma
Abort, yaygın hatalara değil önemli hata durumları için nadir ve ayrılmış olmalıdır.- Yalnızca
Abortbelirli bir sorunun çözülmesi gerektiğinde çağırın. Örneğin,Abortkötü amaçlı istemciler veri almaya çalışıyorsaPOSTveya istemci kodunda büyük veya çok sayıda isteğe neden olan bir hata olduğunda çağırın. AbortHTTP 404 (bulunamadı) gibi yaygın hata durumları için çağrı yapmayın.
- Yalnızca
Çağrılmadan önce HttpResponse. tamamlana eşitlemesini çağırmak Abort Sunucunun yanıtı yazmayı tamamlamasını sağlar. Ancak, istemci davranışı tahmin edilebilir değildir ve bağlantı durdurulmadan önce yanıtı okuyamayabilir.
Bu işlem HTTP/2 için farklıdır çünkü protokol, bağlantıyı kapatmadan bağımsız istek akışlarını iptal etme işlemini destekler. Beş saniyelik boşaltma zaman aşımı uygulanmaz. Yanıt tamamlandıktan sonra herhangi bir okunmamış istek gövdesi verisi varsa, sunucu bir HTTP/2 RST çerçevesi gönderir. Ek istek gövdesi veri çerçeveleri yok sayılır.
Mümkünse, istemcilerin Beklenen: 100-Continue istek üst bilgisini kullanabilmesi ve istek gövdesini göndermeden önce sunucunun yanıt vermesini beklemek daha iyidir. Bu, istemciye gereksiz verileri göndermeden önce yanıtı İnceleme ve iptal etme olanağı sunar.
Ek kaynaklar
- .net 5 ve daha düşük bir Linux üzerinde UNIX yuvaları kullanırken, yuva uygulama kapatılırken otomatik olarak silinmez. daha fazla bilgi için bu GitHub sorunabakın.
- ASP.NET Core projelerinde sorun giderme ve hata ayıklama
- ASP.NET Core 'de HTTPS 'yi zorla
- Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma
- RFC 7230: Ileti sözdizimi ve yönlendirme (Bölüm 5,4: Ana bilgisayar)