Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Jegyzet
Ez nem a cikk legújabb verziója. Az aktuális kiadást ennek a cikknek a .NET 9-es verziójábantalálod.
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. Az aktuális kiadást ennek a cikknek a .NET 9-es verziójábantalálod.
Fontos
Ezek az információk egy olyan előzetes termékre vonatkoznak, amelyet a kereskedelmi forgalomba kerülés előtt jelentősen módosíthatnak. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.
Az aktuális kiadást ennek a cikknek a .NET 9-es verziójábantalálod.
Tom Dykstra , Chris Rossés Stephen Halter
Kestrel ASP.NET Core platformfüggetlenwebkiszolgálója. Kestrel a ASP.NET Core ajánlott kiszolgálója, és alapértelmezés szerint ASP.NET Core-projektsablonokban van konfigurálva.
Kestrelfunkciói a következők:
- Platformfüggetlen:Kestrel egy platformfüggetlen webkiszolgáló, amely Windows, Linux és macOS rendszeren fut.
- Nagy teljesítmény: aKestrel úgy van optimalizálva, hogy nagy számú egyidejű kapcsolatot hatékonyan kezeljen.
- Egyszerű: Erőforrás-korlátozott környezetekben, például tárolókban és peremeszközökön való futtatáshoz optimalizálva.
- biztonságosan megerősítve:Kestrel támogatja a HTTPS-t, és erős védelmet nyújt a webkiszolgáló biztonsági rései ellen.
-
Széles protokoll támogatása:Kestrel támogatja a gyakori webes protokollokat, többek között a következőket:
- HTTP/1.1, HTTP/2 és HTTP/3
- WebSockets
- Integráció a ASP.NET Core-nal: Zökkenőmentes integráció más ASP.NET Core-összetevőkkel, például a köztes szoftverfolyamattal, a függőséginjektálással és a konfigurációs rendszerrel.
-
rugalmas számítási feladatok: Kestrel számos számítási feladatot támogat:
- ASP.NET keretrendszerei, mint a Minimal API-k, MVC, Razor oldalak, SignalR, Blazorés gRPC.
- Fordított proxy létrehozása a YARP segítségével.
- Bővíthetőség:Kestrel testreszabása konfigurációval, köztes szoftverekkel és egyéni átvitelekkel.
- Teljesítménydiagnosztika:Kestrel beépített teljesítménydiagnosztikai funkciókat biztosít, például naplózást és metrikákat.
Kezdje el
ASP.NET Alapvető projektsablonok alapértelmezés szerint Kestrel használnak, ha nem IIS-ben üzemeltetik. A következő sablon által létrehozott Program.cs
esetén a WebApplication.CreateBuilder metódus belül hívja meg a UseKestrel-t.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
A WebApplication
és a WebApplicationBuilder
konfigurálásáról további információt a Minimal API-k gyorsreferenciatalál.
Választható ügyféltanúsítványok
Azokról az alkalmazásokról, amelyeknek tanúsítványsal kell védenie az alkalmazás egy részét, olvassa el Választható ügyféltanúsítványokcímű témakört.
Viselkedés hibakereső csatlakoztatásával
A következő időtúllépések és sebességkorlátozások nem lesznek kényszerítve, ha egy hibakereső egy Kestrel folyamathoz van csatolva:
- KestrelServerLimits.KeepAliveTimeout
- KestrelServerLimits.RequestHeadersTimeout
- KestrelServerLimits.MinRequestBodyDataRate
- KestrelServerLimits.MinResponseDataRate
- IConnectionTimeoutFeature
- IHttpMinRequestBodyDataRateFeature
- IHttpMinResponseDataRateFeature
További erőforrások
- Végpontok konfigurálása az ASP.NET Core Kestrel webszerver
- A
WebApplication.CreateBuilder
metódushívás forrása aUseKestrel
-hez - A ASP.NET Core Kestrel webkiszolgáló beállításainak konfigurálása
- HTTP/2 használata a ASP.NET Core Kestrel webkiszolgálóval
- Mikor érdemes fordított proxyt használni a ASP.NET Core Kestrel webkiszolgálóval
- Kiszolgáló szűrés ASP.NET Core Kestrel webkiszolgálóval
- Alapvető projektek ASP.NET hibaelhárítása és hibakeresése
- HTTPS kényszerítése ASP.NET Core
- Az ASP.NET Core konfigurálása a proxykiszolgálókkal és terheléselosztókkal való együttműködéshez
- RFC 9110: HTTP Szemantika (7.2. szakasz: Hoszt és :authority)
- Ha UNIX-szoftvercsatornákat használ Linuxon, a szoftvercsatornát nem törli automatikusan az alkalmazás leállításakor. További információért lásd a GitHub-feladatot.
Jegyzet
A .NET 5-től a Kestrel libuv-átvitele elavult. A libuv-átvitel nem kap frissítéseket az új operációsrendszer-platformok, például a Windows ARM64 támogatásához, és egy későbbi kiadásban el lesz távolítva. Távolítsa el az elavult UseLibuv metódus hívásait, és használja helyette a Kestrelalapértelmezett Socket átvitelt.
Kestrel ASP.NET Core platformfüggetlenwebkiszolgálója. Kestrel az a webkiszolgáló, amely alapértelmezés szerint megtalálható és engedélyezve van ASP.NET Core-projektsablonokban.
Kestrel a következő forgatókönyveket támogatja:
- HTTPS
- HTTP/2 (kivéve macOS†)
- Átlátszatlan frissítés WebSockets engedélyezéséhez
- Unix socketek az Nginx mögött a nagy teljesítményért
†HTTP/2 egy későbbi kiadásban macOS rendszeren is támogatott lesz.
Kestrel minden olyan platformon és verzióban támogatott, amelyet a .NET Core támogat.
Kezdje el
ASP.NET Alapvető projektsablonok alapértelmezés szerint Kestrel használnak, ha nem IIS-ben üzemeltetik. A következő sablon által létrehozott Program.cs
esetén a WebApplication.CreateBuilder metódus belül hívja meg a UseKestrel-t.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
A WebApplication
és a WebApplicationBuilder
konfigurálásáról további információt a Minimal API-k gyorsreferenciatalál.
Választható ügyféltanúsítványok
Azokról az alkalmazásokról, amelyeknek tanúsítványsal kell védenie az alkalmazás egy részét, olvassa el Választható ügyféltanúsítványokcímű témakört.
Viselkedés hibakereső csatlakoztatásával
A következő időtúllépések és sebességkorlátozások nem lesznek kényszerítve, ha egy hibakereső egy Kestrel folyamathoz van csatolva:
- KestrelServerLimits.KeepAliveTimeout
- KestrelServerLimits.RequestHeadersTimeout
- KestrelServerLimits.MinRequestBodyDataRate
- KestrelServerLimits.MinResponseDataRate
- IConnectionTimeoutFeature
- IHttpMinRequestBodyDataRateFeature
- IHttpMinResponseDataRateFeature
További erőforrások
- Végpontok konfigurálása az ASP.NET Core Kestrel webszerver
- A
WebApplication.CreateBuilder
metódushívás forrása aUseKestrel
-hez - A ASP.NET Core Kestrel webkiszolgáló beállításainak konfigurálása
- HTTP/2 használata a ASP.NET Core Kestrel webkiszolgálóval
- Mikor érdemes fordított proxyt használni a ASP.NET Core Kestrel webkiszolgálóval
- Kiszolgáló szűrés ASP.NET Core Kestrel webkiszolgálóval
- Alapvető projektek ASP.NET hibaelhárítása és hibakeresése
- HTTPS kényszerítése ASP.NET Core
- Az ASP.NET Core konfigurálása a proxykiszolgálókkal és terheléselosztókkal való együttműködéshez
- RFC 9110: HTTP Szemantika (7.2. szakasz: Hoszt és :authority)
- Ha UNIX-szoftvercsatornákat használ Linuxon, a szoftvercsatornát nem törli automatikusan az alkalmazás leállításakor. További információért lásd a GitHub-feladatot.
Jegyzet
A .NET 5-től a Kestrel libuv-átvitele elavult. A libuv-átvitel nem kap frissítéseket az új operációsrendszer-platformok, például a Windows ARM64 támogatásához, és egy későbbi kiadásban el lesz távolítva. Távolítsa el az elavult UseLibuv metódus hívásait, és használja helyette a Kestrelalapértelmezett Socket átvitelt.
Kestrel ASP.NET Core platformfüggetlenwebkiszolgálója. Kestrel az a webkiszolgáló, amely alapértelmezés szerint megtalálható és engedélyezve van ASP.NET Core-projektsablonokban.
Kestrel a következő forgatókönyveket támogatja:
- HTTPS
- HTTP/2 (kivéve macOS†)
- Átlátszatlan frissítés WebSockets engedélyezéséhez
- Unix socketek az Nginx mögött a nagy teljesítményért
†HTTP/2 egy későbbi kiadásban macOS rendszeren is támogatott lesz.
Kestrel minden olyan platformon és verzióban támogatott, amelyet a .NET Core támogat.
Mintakód megtekintése vagy letöltése (letöltése)
Kezdje el
ASP.NET Alapvető projektsablonok alapértelmezés szerint Kestrel használnak, ha nem IIS-ben üzemeltetik. A Program.cs
ConfigureWebHostDefaults metódus meghívja UseKestrel:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
A gazdagép létrehozásáról szóló további információkért lásd a Gazdagép beállítása és Alapértelmezett készítői beállításai szakaszait .NET Generic Host az ASP.NET Core-ben.
Választható ügyféltanúsítványok
Azokról az alkalmazásokról, amelyeknek tanúsítványsal kell védenie az alkalmazás egy részét, olvassa el Választható ügyféltanúsítványokcímű témakört.
További erőforrások
- Végpontok konfigurálása az ASP.NET Core Kestrel webkiszolgáló
- A ASP.NET Core Kestrel webkiszolgáló beállításainak konfigurálása
- HTTP/2 használata a ASP.NET Core Kestrel webkiszolgálóval
- Mikor érdemes fordított proxyt használni a ASP.NET Core Kestrel webkiszolgálóval
- Kiszolgáló szűrés ASP.NET Core Kestrel webkiszolgálóval
- Alapvető projektek ASP.NET hibaelhárítása és hibakeresése
- HTTPS kényszerítése ASP.NET Core
- Az ASP.NET Core konfigurálása a proxykiszolgálókkal és terheléselosztókkal való együttműködéshez
- RFC 9110: HTTP Szemantika (7.2. szakasz: Hoszt és :authority)
- Ha UNIX-szoftvercsatornákat használ Linuxon, a szoftvercsatornát nem törli automatikusan az alkalmazás leállításakor. További információért lásd a GitHub-feladatot.
Jegyzet
A .NET 5-től a Kestrel libuv-átvitele elavult. A libuv-átvitel nem kap frissítéseket az új operációsrendszer-platformok, például a Windows ARM64 támogatásához, és egy későbbi kiadásban el lesz távolítva. Távolítsa el az elavult UseLibuv metódus hívásait, és használja helyette a Kestrelalapértelmezett Socket átvitelt.
Kestrel ASP.NET Core platformfüggetlenwebkiszolgálója. Kestrel az a webkiszolgáló, amely alapértelmezés szerint szerepel ASP.NET Core-projektsablonokban.
Kestrel a következő forgatókönyveket támogatja:
- HTTPS
- Átlátszatlan frissítés WebSockets engedélyezéséhez
- Unix socketek az Nginx mögött a nagy teljesítményért
- HTTP/2 (kivéve macOS†)
†HTTP/2 egy későbbi kiadásban macOS rendszeren is támogatott lesz.
Kestrel minden olyan platformon és verzióban támogatott, amelyet a .NET Core támogat.
Mintakód megtekintése vagy letöltése (letöltése)
HTTP/2-támogatás
HTTP/2 ASP.NET Core-alkalmazásokhoz érhető el, ha az alábbi alapkövetelmények teljesülnek:
- Operációs rendszer†
- Windows Server 2016/Windows 10 vagy újabb‡
- Linux OpenSSL 1.0.2 vagy újabb verzióval (például Ubuntu 16.04 vagy újabb)
- Cél keretrendszer: .NET Core 2.2 vagy újabb
- Application-Layer protokolltárgyalás (ALPN) kapcsolat
- TLS 1.2 vagy újabb kapcsolat
†HTTP/2 egy későbbi kiadásban macOS rendszeren is támogatott lesz. ‡Kestrel korlátozottan támogatja a HTTP/2-t Windows Server 2012 R2 és Windows 8.1 rendszeren. A támogatás korlátozott, mert az ezeken az operációs rendszereken elérhető támogatott TLS-titkosítási csomagok listája korlátozott. A TLS-kapcsolatok védelméhez szükség lehet egy három pontból álló digitális aláírási algoritmussal (ECDSA) létrehozott tanúsítványra.
HTTP/2-kapcsolat létesítése esetén HttpRequest.Protocol jelent HTTP/2
.
A .NET Core 3.0-tól kezdve a HTTP/2 alapértelmezés szerint engedélyezve van. A konfigurációval kapcsolatos további információkért tekintse meg a Kestrel és ListenOptions.Protocols szakaszokat.
Mikor érdemes fordított proxyval használni Kestrel?
A(z) Kestrel önmagában is használható, vagy a(z) fordított proxykiszolgálóval. A fordított proxykiszolgáló HTTP-kéréseket fogad a hálózatról, és továbbítja őket Kestrel. A fordított proxykiszolgálók például a következők:
Kestrel peremhálózati (internetkapcsolattal rendelkező) webkiszolgálóként használják:
fordított proxykonfigurációban használt Kestrel:
A fordított proxykiszolgálóval vagy anélkül végzett konfiguráció egy támogatott üzemeltetési konfiguráció.
Kestrel fordított proxykiszolgáló nélküli peremhálózati kiszolgálóként nem támogatja ugyanazt az IP-címet és portot több folyamat között. Ha Kestrel egy port figyelésére van konfigurálva, Kestrel a kérések Host
fejlécétől függetlenül kezeli az adott port összes forgalmát. A portok megosztására alkalmas fordított proxyk egyedi IP-címen és porton továbbíthatják a kéréseket Kestrel.
Még ha nincs is szükség fordított proxykiszolgálóra, a fordított proxykiszolgáló használata jó választás lehet.
Fordított proxy:
- Korlátozhatja az általa üzemeltetett alkalmazások nyilvános felületét.
- További konfigurációs és mélységi kiberbiztonsági réteg biztosítása.
- Jobban integrálható a meglévő infrastruktúrával.
- Egyszerűsítse a terheléselosztást és a biztonságos kommunikációt (HTTPS). Csak a fordított proxykiszolgálóhoz van szükség X.509-tanúsítványra, és a kiszolgáló egyszerű HTTP használatával tud kommunikálni az alkalmazás kiszolgálóival a belső hálózaton.
Figyelmeztetés
A fordított proxykonfigurációban való üzemeltetéshez Továbbított fejlécek Köztes szoftver konfigurációsszükséges.
Kestrel ASP.NET Core-alkalmazásokban
ASP.NET Core-projektsablonok alapértelmezés szerint Kestrel használnak. A Program.cs
ConfigureWebHostDefaults metódus meghívja UseKestrel:
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
A gazdagép létrehozásáról szóló további információkért lásd a Gazdagép beállítása és Alapértelmezett készítői beállításai szakaszait .NET Generic Host az ASP.NET Core-ben.
Ha további konfigurációt szeretne megadni ConfigureWebHostDefaults
hívása után, használja a ConfigureKestrel
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
// Set properties and call methods on options
})
.UseStartup<Startup>();
});
Kestrel beállítások
A Kestrel webkiszolgáló kényszerkonfigurációs lehetőségekkel rendelkezik, amelyek különösen hasznosak az internetes környezetekben.
Állítson be korlátozásokat a Limits osztály KestrelServerOptions tulajdonságára. A Limits
tulajdonság a KestrelServerLimits osztály egy példányát tartalmazza.
Az alábbi példák a Microsoft.AspNetCore.Server.Kestrel.Core névteret használják:
using Microsoft.AspNetCore.Server.Kestrel.Core;
A cikk későbbi részében látható példákban Kestrel beállítások C#-kódban vannak konfigurálva.
Kestrel beállításokat a konfigurációszolgáltatósegítségével is be lehet állítani. A fájlkonfigurációs szolgáltató például betölthet Kestrel konfigurációt egy appsettings.json
vagy appsettings.{Environment}.json
fájlból:
{
"Kestrel": {
"Limits": {
"MaxConcurrentConnections": 100,
"MaxConcurrentUpgradedConnections": 100
},
"DisableStringReuse": true
}
}
Jegyzet
KestrelServerOptions és végpontkonfigurációk konfigurálhatók konfigurációszolgáltatók által. A fennmaradó Kestrel konfigurációt C#-kódban kell konfigurálni.
Használja az alábbi módszerek egyikét:
Kestrel konfigurálása
Startup.ConfigureServices
:Szúrja be a
IConfiguration
egy példányát aStartup
osztályba. Az alábbi példa feltételezi, hogy az injektált konfiguráció hozzá van rendelve aConfiguration
tulajdonsághoz.Töltsd be a
Startup.ConfigureServices
-ban a konfigurációKestrel
szakaszát a Kestrelkonfigurációjába.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) { ... } }
Konfigurálja a Kestrel-t a gazdagép felépítésekor.
Töltsd be a
Program.cs
-ban a konfigurációKestrel
szakaszát a Kestrelkonfigurációjába.// 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>(); });
A fenti megközelítések mindkét esetben bármely konfigurációszolgáltatóvalműködnek.
Életbentartási időkorlát
Lekéri vagy beállítja az életben tartási időkorlátot. Alapértelmezés szerint 2 perc.
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);
})
Ügyfélkapcsolatok maximális száma
MaxConcurrentConnections MaxConcurrentUpgradedConnections
Az egyidejűleg megnyitott TCP-kapcsolatok maximális száma a teljes alkalmazáshoz beállítható az alábbi kóddal:
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);
})
A HTTP-ről vagy a HTTPS-ről egy másik protokollra (például WebSockets-kérelmekre) frissített kapcsolatokra külön korlát vonatkozik. A kapcsolat frissítése után a rendszer nem számít bele a MaxConcurrentConnections
korlátba.
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);
})
A kapcsolatok maximális száma alapértelmezés szerint korlátlan (null).
Kérelem törzsének maximális mérete
A kérelem törzsének alapértelmezett maximális mérete 30 000 000 bájt, ami körülbelül 28,6 MB.
A ASP.NET Core MVC-alkalmazások korlátjának felülbírálására javasolt módszer a RequestSizeLimitAttribute attribútum használata műveletmetóduson:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Íme egy példa, amely bemutatja, hogyan konfigurálhatja az alkalmazás korlátozását minden kéréshez:
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);
})
Felülbírálja egy adott kérelem beállítását a köztes szoftverben:
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));
}
Kivétel akkor történik, ha az alkalmazás konfigurálja a kérelem korlátját, miután az alkalmazás megkezdte a kérés olvasását. Van egy IsReadOnly
tulajdonság, amely azt jelzi, hogy a MaxRequestBodySize
tulajdonság írásvédett állapotban van-e, ami azt jelenti, hogy túl késő a korlát konfigurálásához.
Ha egy alkalmazás folyamaton kívüli fut a ASP.NET core modulmögött, Kestrelkérés törzsméretkorlátja le van tiltva, mert az IIS már beállítja a korlátot.
A kérés törzsének minimális adatsebessége
MinRequestBodyDataRate MinResponseDataRate
Kestrel másodpercenként ellenőrzi, hogy az adatok a megadott bájt/másodperc sebességgel érkeznek-e. Ha a ráta a minimális érték alá csökken, a kapcsolat időtúllépéssel megszakad. A türelmi időszak az az időtartam, amelyet Kestrel biztosít az ügyfélnek, hogy a küldési sebességét megemelje a minimálisra; ez idő alatt a ráta nincs ellenőrizve. A türelmi időszak segít elkerülni azokat a kapcsolatokat, amelyek kezdetben lassú sebességgel küldenek adatokat a TCP lassú indítása miatt.
Az alapértelmezett minimális sebesség 240 bájt/másodperc, 5 másodperces türelmi idővel.
A válaszra egy minimális díj is vonatkozik. A kérelemkorlátot és a válaszkorlátot megadó kód ugyanaz, eltekintve attól, hogy RequestBody
vagy Response
szerepel a tulajdonság- és interfésznevekben.
Íme egy példa, amely bemutatja, hogyan konfigurálhatók a minimális adatátviteli sebességek Program.cs
-ban.
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);
})
Felülbírálja a kérelemenkénti minimális díjkorlátokat a köztes szoftverben:
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));
}
Az előző mintában hivatkozott IHttpMinResponseDataRateFeature nem szerepel a HTTP/2-kérelmek HttpContext.Features
, mert a http/2 esetében általában nem támogatott a kérelemalapú sebességkorlátok módosítása, mivel a protokoll támogatja a kérelmek multiplexálását. A IHttpMinRequestBodyDataRateFeature azonban továbbra is HttpContext.Features
a HTTP/2-kérésekhez, mivel az olvasási sebességkorlát továbbra is le tiltható teljes egészében kérésenként, ha IHttpMinRequestBodyDataRateFeature.MinDataRate
null
egy HTTP/2-kérés esetében is. Kísérlet a IHttpMinRequestBodyDataRateFeature.MinDataRate
olvasására vagy annak bármi másra állítására, mint null
, egy NotSupportedException
kivételt eredményez egy HTTP/2 kérés esetén.
A KestrelServerOptions.Limits
konfigurált kiszolgálószintű sebességkorlátozások továbbra is érvényesek a HTTP/1.x és a HTTP/2 kapcsolatokra.
Fejléckérések időtúllépése
Lekéri vagy beállítja, hogy a kiszolgáló mennyi időt tölt a kérésfejlécek fogadásával. Alapértelmezés szerint 30 másodperc.
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);
})
Streamek maximális száma kapcsolatonként
Http2.MaxStreamsPerConnection
http/2-kapcsolatonként korlátozza az egyidejű kérésfolyamok számát. A felesleges streameket elutasítjuk.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxStreamsPerConnection = 100;
});
Az alapértelmezett érték 100.
Fejléctábla mérete
A HPACK dekóder kibontja a HTTP/2 kapcsolatok HTTP-fejléceit.
Http2.HeaderTableSize
korlátozza a HPACK dekóder által használt fejléctömörítési táblázat méretét. Az érték oktettben van megadva, és nullánál nagyobbnak (0) kell lennie.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.HeaderTableSize = 4096;
});
Az alapértelmezett érték 4096.
Keret maximális mérete
Http2.MaxFrameSize
a kiszolgáló által fogadott vagy küldött HTTP/2 kapcsolatkeret maximális megengedett méretét jelzi. Az érték oktettben van megadva, és 2^14 (16 384) és 2^24-1 (16 777 215) között kell lennie.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxFrameSize = 16384;
});
Az alapértelmezett érték 2^14 (16 384).
Kérelem fejlécének maximális mérete
Http2.MaxRequestHeaderFieldSize
a kérelemfejlécértékek oktettjeiben megengedett maximális méretet jelzi. Ez a korlát a tömörített és tömörítetlen ábrázolásokban lévő névre és értékre is vonatkozik. Az értéknek nullánál (0) nagyobbnak kell lennie.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.MaxRequestHeaderFieldSize = 8192;
});
Az alapértelmezett érték 8192.
Kezdeti kapcsolatablak mérete
Http2.InitialConnectionWindowSize
jelzi a maximálisan egyszerre pufferelt kérelemtörzsadatok mennyiségét bájtban, összesítve minden kapcsolaton keresztül minden kérelem (folyam) esetében. A kérelmeket a Http2.InitialStreamWindowSize
is korlátozza. Az értéknek nagyobbnak vagy egyenlőnek kell lennie, mint 65 535, és kisebbnek kell lennie, mint 2^31 (2 147 483 648).
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialConnectionWindowSize = 131072;
});
Az alapértelmezett érték 128 KB (131 072).
Kezdeti streamablak mérete
Http2.InitialStreamWindowSize
a kérelem törzsének maximális adatmennyiségét jelzi a kiszolgáló puffereinek bájtban, kérésenként (streamenként) egyszerre. A kérelmeket a Http2.InitialConnectionWindowSize
is korlátozza. Az értéknek nagyobbnak vagy egyenlőnek kell lennie, mint 65 535, és kisebbnek kell lennie, mint 2^31 (2 147 483 648).
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Limits.Http2.InitialStreamWindowSize = 98304;
});
Az alapértelmezett érték 96 KB (98 304).
Előzetesek
A HTTP-záró fejlécek hasonlóak a HTTP-fejlécekhez, azzal a különbséggel, hogy a válasz törzsének elküldése után küldik őket. Az IIS és a HTTP.sysesetében csak a HTTP/2 válasz trailer támogatott.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
Az előző példakódban:
-
SupportsTrailers
biztosítja, hogy a pótkocsik támogatottak legyenek a válaszhoz. -
DeclareTrailer
hozzáadja a megadott pótkocsinevet aTrailer
válaszfejléchez. A válasz trailer mezőinek deklarálása nem kötelező, de ajánlott. HaDeclareTrailer
van meghívva, annak a válaszfejlécek elküldése előtt kell lennie. -
AppendTrailer
hozzáfűzi a pótkocsit.
Visszaállítás
Az alaphelyzetbe állítás lehetővé teszi, hogy a kiszolgáló visszaállítsa a HTTP/2 kérést egy megadott hibakóddal. Az alaphelyzetbe állítás kérését megszakítottnak tekintjük.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
az előző kód példában a INTERNAL_ERROR
hibakódot adja meg. A HTTP/2 hibakódokkal kapcsolatos további információkért tekintse meg a HTTP/2 specifikáció hibakódjánakszakaszát.
Szinkron be-/kimenet
AllowSynchronousIO szabályozza, hogy engedélyezve van-e a szinkron I/O a kéréshez és a válaszhoz. Az alapértelmezett érték a false
.
Figyelmeztetés
A nagyszámú blokkoló szinkron I/O-művelet szálkészlet-kimerüléshez vezethet, ami miatt az alkalmazás válaszképtelenné válik. Csak akkor engedélyezze a AllowSynchronousIO
, ha olyan kódtárat használ, amely nem támogatja az aszinkron I/O-t.
Az alábbi példa lehetővé teszi a szinkron I/O-t:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.AllowSynchronousIO = true;
})
További információ az egyéb Kestrel lehetőségekről és korlátokról:
Végpontkonfiguráció
Alapértelmezés szerint ASP.NET Core a következőhöz kötődik:
http://localhost:5000
-
https://localhost:5001
(helyi fejlesztési tanúsítvány esetén)
Adja meg az URL-címeket a következővel:
-
ASPNETCORE_URLS
környezeti változó. -
--urls
parancssori argumentum. -
urls
gazdagép konfigurációs kulcs. -
UseUrls
bővítménymetódus.
Az e megközelítések használatával megadott érték lehet egy vagy több HTTP- és HTTPS-végpont (HTTPS, ha van alapértelmezett tanúsítvány). Konfigurálja az értéket pontosvesszővel tagolt listaként (például "Urls": "http://localhost:8000;http://localhost:8001"
).
További információért ezekkel a megközelítésekkel kapcsolatban lásd a szervercímek és a konfiguráció felülbírálásarészt.
Létrejön egy fejlesztési tanúsítvány:
- Amikor a .NET Core SDK telepítve van.
- A dev-certs eszköz egy tanúsítvány létrehozásához használható.
Egyes böngészők explicit engedélyt igényelnek a helyi fejlesztési tanúsítvány megbízhatóságához.
A projektsablonok alapértelmezés szerint HTTPS-alapú futtatásra konfigurálják az alkalmazásokat, és tartalmazzák HTTPS-átirányítást és a HSTS-támogatást.
Hívja meg a(z) Listen-n a ListenUnixSocket vagy a KestrelServerOptions metódust az URL előtagok és portok konfigurálásához Kestrelszámára.
UseUrls
, a --urls
parancssori argumentum, urls
gazdagép konfigurációs kulcsa és a ASPNETCORE_URLS
környezeti változó szintén működik, de a jelen szakaszban később feljegyzett korlátozásokkal rendelkezik (a HTTPS-végpont konfigurációja esetén egy alapértelmezett tanúsítványnak kell rendelkezésre állnia).
KestrelServerOptions
konfiguráció:
Állítsa be az alapértelmezett végpontokat (Action<ListenOptions>)
Meghatározza a Action
konfigurációt, amelyet minden meghatározott végponton futtatni kell. A ConfigureEndpointDefaults
többszöri hívása lecseréli a korábbi Action
-eket az utolsó megadott Action
-re.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
});
Jegyzet
A Listenáltal létrehozott végpontok, amelyekre a hívás előtt a ConfigureEndpointDefaults nem vonatkozik, nem alkalmazzák az alapértelmezett értékeket.
HttpsDefaults konfigurálása (HttpsConnectionAdapterOptions< művelet>)
Megad egy Action
konfigurációt, amelyet minden egyes HTTPS-végpont számára kell futtatni. A ConfigureHttpsDefaults
többszöri hívása lecseréli a korábbi Action
-eket az utolsó megadott Action
-re.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
// certificate is an X509Certificate2
listenOptions.ServerCertificate = certificate;
});
});
Jegyzet
A Listenáltal létrehozott végpontok, amelyekre a hívás előtt a ConfigureHttpsDefaults nem vonatkozik, nem alkalmazzák az alapértelmezett értékeket.
Konfigurálás(IConfiguration)
Létrehoz egy konfigurációs betöltőt az Kestrel beállításának elvégzéséhez, amely bemenetként egy IConfiguration-et vesz igénybe. A konfigurációt a Kestrelkonfigurációs szakaszára kell korlátozni.
ListenOptions.UseHttps (HTTPS-használat hallgatási beállítások)
Konfigurálja a Kestrel HTTPS használatára.
ListenOptions.UseHttps
bővítmények:
-
UseHttps
: Konfigurálja a Kestrel, hogy https-t használjon az alapértelmezett tanúsítvánnyal. Kivételt eredményez, ha nincs alapértelmezett tanúsítvány konfigurálva. 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
paraméterek:
-
filename
egy tanúsítványfájl elérési útja és fájlneve az alkalmazás tartalomfájljait tartalmazó könyvtárhoz viszonyítva. -
password
az X.509-tanúsítványadatok eléréséhez szükséges jelszó. -
configureOptions
egyAction
konfigurálására szolgálóHttpsConnectionAdapterOptions
. "ListenOptions
-at adja vissza." - A
storeName
tanúsítványtár, amelyből a tanúsítványt be kell tölteni. -
subject
a tanúsítvány tulajdonosának neve. -
allowInvalid
jelzi, hogy érvénytelen tanúsítványokat kell-e figyelembe venni, például önaláírt tanúsítványokat. - A
location
a bolthely, ahonnan a tanúsítvány betöltésre kerül. -
serverCertificate
az X.509-tanúsítvány.
Éles környezetben a HTTPS-t explicit módon kell konfigurálni. Legalább egy alapértelmezett tanúsítványt kell megadni.
A következőkben ismertetett támogatott konfigurációk:
- Nincs konfiguráció
- Az alapértelmezett tanúsítvány cseréje a konfigurációból
- Az alapértelmezett értékek módosítása a kódban
Nincs konfiguráció
Kestrel figyeli http://localhost:5000
és https://localhost:5001
(ha van alapértelmezett tanúsítvány).
Az alapértelmezett tanúsítvány cseréje a konfigurációból
CreateDefaultBuilder
alapértelmezés szerint meghívja Configure(context.Configuration.GetSection("Kestrel"))
Kestrel konfiguráció betöltéséhez. Az alapértelmezett HTTPS alkalmazásbeállításainak konfigurációs sémája Kestrelérhető el. Konfiguráljon több végpontot, köztük az URL-címeket és a használni kívánt tanúsítványokat egy lemezen lévő fájlból vagy egy tanúsítványtárolóból.
Az alábbi appsettings.json
példában:
- Állítsa AllowInvalid
true
értékre az érvénytelen tanúsítványok (például önaláírt tanúsítványok) használatának engedélyezéséhez. - Minden olyan HTTPS-végpont, amely nem ad meg tanúsítványt (HttpsDefaultCert a következő példában) a Tanúsítványok>Alapértelmezett vagy a fejlesztési tanúsítvány alatt meghatározott tanúsítványra kerül vissza.
{
"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>"
}
}
}
}
A Elérési út és a Jelszó helyett bármely tanúsítványcsomóponthoz alternatívaként megadhatja a tanúsítványt a tanúsítványtár mezőinek használatával. A Tanúsítványok>Alapértelmezett tanúsítvány például a következőként adható meg:
"Default": {
"Subject": "<subject; required>",
"Store": "<cert store; required>",
"Location": "<location; defaults to CurrentUser>",
"AllowInvalid": "<true or false; defaults to false>"
}
Sémajegyzetek:
- A végpontok neve nem érzékeny a kis- és nagybetűkre. Például
HTTPS
ésHttps
érvényesek. - A
Url
paraméter minden végponthoz szükséges. A paraméter formátuma megegyezik a legfelső szintűUrls
konfigurációs paraméterével, azzal a kivételrel, hogy egyetlen értékre van korlátozva. - Ezek a végpontok a felső szintű
Urls
konfigurációban definiált végpontokat helyettesítik ahelyett, hogy hozzáadják őket. A kódbanListen
keresztül definiált végpontok a konfigurációs szakaszban meghatározott végpontokkal együtt halmozódnak. - A
Certificate
szakasz nem kötelező. Ha aCertificate
szakasz nincs megadva, a rendszer a korábbi forgatókönyvekben definiált alapértelmezett értékeket használja. Ha nem érhetők el alapértelmezett értékek, a kiszolgáló kivételt jelez, és nem indul el. - A
Certificate
szakasz Elérési út–Jelszó és Tárgy–Tároló tanúsítványokat is támogatja. - Ilyen módon tetszőleges számú végpont definiálható, amennyiben nem okoznak portütközéseket.
-
options.Configure(context.Configuration.GetSection("{SECTION}"))
egyKestrelConfigurationLoader
metódussal rendelkező.Endpoint(string name, listenOptions => { })
ad vissza, amely egy konfigurált végpont beállításainak kiegészítésére használható:
webBuilder.UseKestrel((context, serverOptions) =>
{
serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
.Endpoint("HTTPS", listenOptions =>
{
listenOptions.HttpsOptions.SslProtocols = SslProtocols.Tls12;
});
});
KestrelServerOptions.ConfigurationLoader
közvetlenül elérhető a meglévő rakodón való iterálás folytatásához, például a CreateDefaultBuilderáltal biztosított.
- Az egyes végpontok konfigurációs szakasza a
Endpoint
metódus beállításai között érhető el, hogy az egyéni beállítások olvashatók legyenek. - Előfordulhat, hogy több konfiguráció is betöltődik, ha ismét meghívja
options.Configure(context.Configuration.GetSection("{SECTION}"))
egy másik szakaszsal. Csak az utolsó konfigurációt használja a rendszer, kivéve, haLoad
-t explicit módon meghívják a korábbi példányokban. A metacsomag nem hívja megLoad
, hogy az alapértelmezett konfigurációs szakasz lecserélhető legyen. -
KestrelConfigurationLoader
aListen
API-családnak aKestrelServerOptions
Endpoint
overload funkcióit tükrözi, így a kód- és konfigurációvégpontok ugyanabban a helyben konfigurálhatók. Ezek a túlterhelések nem használnak neveket, és csak a konfiguráció alapértelmezett beállításait használják.
A kód alapértelmezett értékének módosítása
ConfigureEndpointDefaults
és ConfigureHttpsDefaults
az ListenOptions
és a HttpsConnectionAdapterOptions
alapértelmezett beállításainak módosítására használható, beleértve az előző forgatókönyvben megadott alapértelmezett tanúsítvány felülírását is. A végpontok konfigurálása előtt ConfigureEndpointDefaults
és ConfigureHttpsDefaults
kell meghívni.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
// Configure endpoint defaults
});
serverOptions.ConfigureHttpsDefaults(listenOptions =>
{
listenOptions.SslProtocols = SslProtocols.Tls12;
});
});
Kestrel SNI- támogatása
kiszolgálónév-jelzés (SNI) több tartomány üzemeltetésére is használható ugyanazon az IP-címen és porton. Az SNI működéséhez az ügyfél elküldi a biztonságos munkamenet állomásnevét a kiszolgálónak a TLS-kézfogás során, hogy a kiszolgáló a megfelelő tanúsítványt tudja biztosítani. Az ügyfél a mellékelt tanúsítványt használja a kiszolgálóval való titkosított kommunikációhoz a TLS-kézfogást követő biztonságos munkamenet során.
Kestrel támogatja az SNI-t a ServerCertificateSelector
visszahívási funkcióval. A visszahívást kapcsolatonként egyszer hívjuk meg, hogy az alkalmazás megvizsgálhassa a gazdagép nevét, és kiválaszthassa a megfelelő tanúsítványt.
Az SNI-támogatáshoz a következőre van szükség:
- A célkeretrendszer
netcoreapp2.1
vagy annál újabb verzióján fut. A visszahívásnet461
vagy újabb rendszeren hívódik meg, de aname
mindignull
. Aname
akkor isnull
, ha az ügyfél nem adja meg a hosztnév paramétert a TLS kapcsolatfelvétel során. - Minden webhely ugyanazon a Kestrel példányon fut. Kestrel nem támogatja az IP-cím és a port megosztását több példány között fordított proxy (reverse proxy) nélkül.
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;
};
});
});
});
Kapcsolatnaplózás
Hívja meg UseConnectionLogging, hogy hibakeresési szintű naplókat bocsátjon ki egy kapcsolat bájtszintű kommunikációjához. A kapcsolatnaplózás hasznos az alacsony szintű kommunikációval kapcsolatos problémák elhárításához, például a TLS titkosítása és a proxyk mögött. Ha UseConnectionLogging
UseHttps
elé kerül, a rendszer titkosított forgalmat naplóz. Ha UseConnectionLogging
UseHttps
után kerül, a rendszer naplózza a visszafejtett forgalmat.
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseConnectionLogging();
});
});
Hozzákapcsolódás TCP-csatlakozóhoz
A Listen metódus egy TCP-szoftvercsatornához kapcsolódik, és egy beállítási lambda engedélyezi az X.509-tanúsítványkonfigurációt:
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>();
});
A példa a ListenOptionsvégpont HTTPS-konfigurációját mutatja be. Ugyanezzel az API-val konfigurálhat más Kestrel beállításokat adott végpontokhoz.
Windows rendszeren az önaláírt tanúsítványok a New-SelfSignedCertificate
PowerShell-parancsmaghasználatával hozhatók létre. Lásd a nem támogatott példát: UpdateIISExpressSSLForChrome.ps1
.
MacOS, Linux és Windows rendszeren a tanúsítványok OpenSSLhasználatával hozhatók létre.
Kötés Unix-szoftvercsatornához
Az Nginx használatával figyeljen egy Unix socketre ListenUnixSocket a jobb teljesítmény érdekében, ahogy az ebben a példában látható:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock");
serverOptions.ListenUnixSocket("/tmp/kestrel-test.sock",
listenOptions =>
{
listenOptions.UseHttps("testCert.pfx",
"testpassword");
});
})
- Az Nginx konfigurációs fájlban állítsa a
server
>location
>proxy_pass
bejegyzésthttp://unix:/tmp/{KESTREL SOCKET}:/;
értékre.{KESTREL SOCKET}
a ListenUnixSocket számára biztosított foglalat neve (például az előző példábankestrel-test.sock
). - Győződjön meg arról, hogy a foglalat írásra alkalmas az Nginx számára (például
chmod go+w /tmp/kestrel-test.sock
).
0. port
Ha a portszám 0
van megadva, Kestrel dinamikusan kapcsolódik egy elérhető porthoz. Az alábbi példa bemutatja, hogyan állapítható meg futásidőben, hogy melyik porthoz van ténylegesen hozzárendelve a 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>");
});
}
Az alkalmazás futtatásakor a konzolablak kimenete azt a dinamikus portot jelzi, ahol az alkalmazás elérhető:
Listening on the following addresses: http://127.0.0.1:48508
Korlátozások
A végpontok konfigurálása a következő módszerekkel:
- UseUrls
-
--urls
parancssori argumentum - gazdagép konfigurációs kulcs
urls
-
ASPNETCORE_URLS
környezeti változó
Ezek a módszerek a Kestrelkívüli kiszolgálókon való kódmunkához hasznosak. Vegye figyelembe azonban a következő korlátozásokat:
- A HTTPS csak akkor használható ezekkel a módszerekkel, ha a HTTPS-végpont konfigurációjában egy alapértelmezett tanúsítvány van megadva (például
KestrelServerOptions
konfiguráció vagy konfigurációs fájl használata a jelen témakör korábbi részében látható módon). - A
Listen
és aUseUrls
megközelítés egyidejű használata esetén aListen
végpontok felülbírálják aUseUrls
végpontokat.
IIS-végpont konfigurálása
Az IIS használatakor az IIS felülbírálási kötéseinek URL-kötéseit Listen
vagy UseUrls
állítja be. További információ: ASP.NET Core Module témakör.
FigyelésiBeállítások.Protokollok
A Protocols
tulajdonság létrehozza a kapcsolati végponton vagy a kiszolgálón engedélyezett HTTP-protokollokat (HttpProtocols
). Rendeljen hozzá egy értéket a Protocols
tulajdonsághoz a HttpProtocols
enumerációból.
HttpProtocols számérték |
Engedélyezett kapcsolati protokoll |
---|---|
Http1 |
Csak HTTP/1.1. TLS-sel vagy anélkül is használható. |
Http2 |
Csak HTTP/2. TLS nélkül csak akkor használható, ha az ügyfél támogatja a Korábbi tudás mód. |
Http1AndHttp2 |
HTTP/1.1 és HTTP/2. A HTTP/2 megköveteli, hogy az ügyfél a HTTP/2-t válassza ki a TLS Application-Layer protokolltárgyalás (ALPN) kézfogás során; ellenkező esetben a kapcsolat alapértelmezés szerint a HTTP/1.1 lesz. |
A végpontok alapértelmezett ListenOptions.Protocols
értéke HttpProtocols.Http1AndHttp2
.
TLS-korlátozások HTTP/2-hez:
- TLS 1.2-es vagy újabb verzió
- Az újratárgyalás le van tiltva
- Tömörítés letiltva
- Rövid élettartamú kulcscsere minimális méretei:
- Elliptikus görbe Diffie-Hellman (ECDHE) [RFC4492]: legalább 224 bit
- Véges mező Diffie-Hellman (DHE) [
TLS12
]: legalább 2048 bit
- A titkosítási csomag nem tiltott.
A [TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
] TLS-ECDHE
alapértelmezés szerint támogatott a P-256 elliptikus görbével [FIPS186
].
Az alábbi példa HTTP/1.1 és HTTP/2 kapcsolatokat engedélyez a 8000-s porton. A kapcsolatokat a TLS egy megadott tanúsítvánnyal védi:
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(IPAddress.Any, 8000, listenOptions =>
{
listenOptions.UseHttps("testCert.pfx", "testPassword");
});
});
A Connection Middleware használatával kapcsolatonként szűrheti a TLS-kézfogásokat adott rejtjelek esetében, ha szükséges.
Az alábbi példa NotSupportedException hibát dob minden olyan titkosítási algoritmus esetén, amelyet az alkalmazás nem támogat. Másik lehetőségként definiálhatja és összehasonlíthatja ITlsHandshakeFeature.CipherAlgorithm az elfogadható titkosítási csomagok listájával.
Nem használ titkosítást CipherAlgorithmType.Null titkosítási algoritmussal.
// 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();
});
}
}
}
A kapcsolatszűrés egy IConnectionBuilder lambdán keresztül is konfigurálható:
// 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();
});
});
});
Linuxon CipherSuitesPolicy használható a TLS-kézfogások kapcsolatonkénti szűrésére:
// 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,
// ...
});
};
});
});
Protokoll beállítása a konfiguráció alapján
CreateDefaultBuilder
alapértelmezés szerint meghívja serverOptions.Configure(context.Configuration.GetSection("Kestrel"))
Kestrel konfiguráció betöltéséhez.
Az alábbi appsettings.json
példa a HTTP/1.1 protokollt hozza létre az összes végpont alapértelmezett kapcsolati protokolljaként:
{
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http1"
}
}
}
Az alábbi appsettings.json
példa a HTTP/1.1 kapcsolati protokollt hozza létre egy adott végponthoz:
{
"Kestrel": {
"Endpoints": {
"HttpsDefaultCert": {
"Url": "https://localhost:5001",
"Protocols": "Http1"
}
}
}
}
A konfiguráció által beállított kód felülbírálási értékekben megadott protokollok.
URL-előtagok
Ha UseUrls
, --urls
parancssori argumentumot, urls
gazdagép konfigurációs kulcsát vagy ASPNETCORE_URLS
környezeti változót használ, az URL-előtagok az alábbi formátumok bármelyikében lehetnek.
Csak a HTTP URL-előtagok érvényesek.
Kestrel nem támogatja a HTTPS-t az URL-kötések UseUrls
használatával történő konfigurálásakor.
IPv4-cím portszámmal
http://65.55.39.10:80/
0.0.0.0
egy speciális eset, amely az összes IPv4-címhez kötődik.IPv6-cím portszámmal
http://[0:0:0:0:0:ffff:4137:270a]:80/
[::]
az IPv40.0.0.0
IPv6-megfelelője.Hosztnév portszámmal
http://contoso.com:80/ http://*:80/
A hosztnevek,
*
és+
, nem különlegesek. Azokat, amelyeket nem ismernek fel érvényes IP-címként, vagy alocalhost
-t, minden IPv4- és IPv6-IP-címhez kötik. Ha különböző gazdagépneveket szeretne különböző ASP.NET Core-alkalmazásokhoz kötni ugyanazon a porton, használjon HTTP.sys vagy fordított proxykiszolgálót, például IIS, Nginx vagy Apache.Figyelmeztetés
A fordított proxykonfigurációban való üzemeltetéshez Továbbított fejlécek Köztes szoftver konfigurációsszükséges.
Gazdagép
localhost
neve portszámmal vagy visszacsatolási IP-cím portszámmalhttp://localhost:5000/ http://127.0.0.1:5000/ http://[::1]:5000/
Ha
localhost
van megadva, Kestrel IPv4- és IPv6-visszacsatolási felületekhez is megpróbál csatlakozni. Ha a kért portot egy másik szolgáltatás használja bármelyik visszacsatolási felületen, Kestrel nem indul el. Ha bármelyik visszacsatolási felület más okból nem érhető el (leggyakrabban azért, mert az IPv6 nem támogatott), Kestrel figyelmeztetést naplóz.
Hosztszűrés
Bár a Kestrel támogatja az olyan előtagokon alapuló konfigurációt, mint a http://example.com:5000
, a Kestrel nagyrészt figyelmen kívül hagyja a gazdagép nevét. A gazdagép localhost
egy speciális eset, amelyet a visszacsatolási címekhez való kötéshez használnak. Az explicit IP-cím kivételével minden gazdagép az összes nyilvános IP-címhez kötődik.
Host
fejlécek nincsenek érvényesítve.
Áthidaló megoldásként használja a Host Filtering Middleware parancsot. A Host Filtering Middleware-t a Microsoft.AspNetCore.HostFiltering csomag biztosítja, amely implicit módon ASP.NET Core-alkalmazásokhoz érhető el. A köztes szoftvert a CreateDefaultBuilderadja hozzá, amely meghívja a AddHostFiltering-et.
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
A host filtering Middleware alapértelmezés szerint le van tiltva. A köztes szoftver engedélyezéséhez definiáljon egy AllowedHosts
kulcsot appsettings.json
/appsettings.{Environment}.json
. Az érték a portszám nélküli gazdagépnevek pontosvesszővel tagolt listája:
appsettings.json
:
{
"AllowedHosts": "example.com;localhost"
}
Jegyzet
Továbbított fejlécek Köztes szoftver is rendelkezik AllowedHosts lehetőséggel. A továbbított fejlécek köztes szoftver és a gazdagépszűrési köztes szoftver hasonló funkcióval rendelkeznek a különböző forgatókönyvekhez. A AllowedHosts
Továbbításos fejlécek köztes szoftverrel való beállítása akkor megfelelő, ha a Host
fejléc nem marad meg, miközben a kéréseket fordított proxykiszolgálóval vagy terheléselosztóval továbbítja. A AllowedHosts
gazdagépszűrési köztes szoftverrel való beállítása akkor megfelelő, ha Kestrel nyilvános elérésű peremhálózati kiszolgálóként használják, vagy ha a Host
fejlécet közvetlenül továbbítják.
További információért a Továbbított Fejlécek Middleware-ről lásd Az ASP.NET Core konfigurálása proxykiszolgálókkal és terheléselosztókkal.
Libuv átviteli konfiguráció
Libuv (UseLibuv) használatát igénylő projektek esetén:
Adjon hozzá függőséget a
Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv
csomaghoz az alkalmazás projektfájljában:<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv" Version="{VERSION}" />
Hívás UseLibuv a
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 kérelem ürítése
A HTTP-kapcsolatok megnyitása időigényes. HTTPS esetén erőforrás-igényes is. Ezért Kestrel a HTTP/1.1 protokoll alapján próbálja újra felhasználni a kapcsolatokat. A kérési törzset teljes mértékben fel kell használni a kapcsolat újrahasználatához. Az alkalmazás nem mindig használja fel a kérelem törzsét, például POST
kéréseket, ahol a kiszolgáló átirányítást vagy 404-választ ad vissza. Az POST
-redirect esetben:
- Lehetséges, hogy az ügyfél már elküldte a
POST
adatok egy részét. - A kiszolgáló írja a 301-választ.
- A kapcsolat csak akkor használható új kéréshez, ha az előző kérelemtörzsből származó
POST
adatok teljes olvasása megtörtént. - Kestrel megpróbálja kiüríteni a kérés törzsét. A kérelem törzsének kiürítése azt jelenti, hogy az adatokat feldolgozás nélkül elolvassuk, majd elvetjük.
A leeresztési folyamat kompromisszumot köt a kapcsolat újbóli felhasználásának engedélyezése és a fennmaradó adatok ürítéséhez szükséges idő között:
- A ürítés öt másodperces időtúllépéssel rendelkezik, ami nem konfigurálható.
- Ha a
Content-Length
vagyTransfer-Encoding
fejléc által megadott összes adat nem lett beolvasva az időtúllépés előtt, a kapcsolat lezárul.
Előfordulhat, hogy a válasz megírása előtt vagy után azonnal meg szeretné szüntetni a kérést. Előfordulhat például, hogy az ügyfelek korlátozó adatkorlátokkal rendelkeznek, ezért a feltöltött adatok korlátozása prioritás lehet. Ilyen esetekben a kérés leállításához hívja meg HttpContext.Abort vezérlőből, Razor oldalról vagy köztes szoftverből.
A Abort
meghívására vannak korlátozások:
- Az új kapcsolatok létrehozása lassú és költséges lehet.
- Nincs garancia arra, hogy az ügyfél elolvasta a választ, mielőtt a kapcsolat bezárul.
- A
Abort
hívásának ritkának kell lennie, és csak súlyos hibák esetén legyen fenntartva, nem gyakori hibák esetén.- Csak akkor hívja
Abort
, ha egy adott problémát meg kell oldani. Hívja példáulAbort
, ha rosszindulatú felhasználók próbálnakPOST
adatokat megszerezni, vagy ha az ügyfélkódban olyan hiba van, amely nagy számú vagy számos kérést okoz. - Ne hívjon olyan gyakori hibahelyzetekhez
Abort
-t, mint a HTTP 404 (Nem található).
- Csak akkor hívja
A HttpResponse.CompleteAsync hívása a Abort
hívása előtt biztosítja, hogy a kiszolgáló befejezte a válasz írását. Az ügyfél viselkedése azonban nem kiszámítható, és előfordulhat, hogy a kapcsolat megszakadása előtt nem olvassa fel a választ.
Ez a folyamat a HTTP/2 esetében eltérő, mivel a protokoll támogatja az egyes kérésfolyamok megszakítását a kapcsolat bezárása nélkül. Az öt másodperces ürítési időtúllépés nem érvényes. Ha a válasz befejezése után olvasatlan kérés törzsadatai vannak, a kiszolgáló HTTP/2 RST-keretet küld. A rendszer figyelmen kívül hagyja a további kérelemtörzs-adatkereteket.
Ha lehetséges, jobb, ha az ügyfelek használják a Várható: 100-continue kérés fejlécet, és várjanak, amíg a kiszolgáló válaszol, mielőtt elkezdenék elküldeni a kérelem törzsét. Ez lehetővé teszi az ügyfél számára, hogy megvizsgálja a választ, és megszakítsa a szükségtelen adatok elküldése előtt.
További erőforrások
- Ha UNIX-szoftvercsatornákat használ Linuxon, a szoftvercsatornát nem törli automatikusan az alkalmazás leállításakor. További információért lásd a GitHub-feladatot.
- Alapvető projektek ASP.NET hibaelhárítása és hibakeresése
- HTTPS kényszerítése ASP.NET Core
- Az ASP.NET Core konfigurálása a proxykiszolgálókkal és terheléselosztókkal való együttműködéshez
- RFC 9110: HTTP Szemantika (7.2. szakasz: Hoszt és :authority)