Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Note
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.
Warning
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Tom Dykstra a Chris Ross
HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. HTTP.sys je alternativou k Kestrel serveru a nabízí některé funkce, které Kestrel neposkytují.
Important
HTTP.sys není kompatibilní s modulem ASP.NET Core a nejde ho používat se službou IIS nebo IIS Express.
HTTP.sys podporuje následující funkce:
- Ověřování systému Windows
- Sdílení portů
- HTTPS s SNI
- HTTP/2 přes TLS (Windows 10 nebo novější)
- HTTP/3 přes TLS (Windows 11 nebo novější)
- Přímý přenos souborů
- Ukládání odpovědí do mezipaměti
- WebSockets (Windows 8 nebo novější)
- Přizpůsobitelné popisovače zabezpečení
- Automatické vyřazení fondu paměti
Podporované verze Windows:
- Windows 7 nebo novější
- Windows Server 2008 R2 nebo novější
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Kdy použít HTTP.sys
HTTP.sys je užitečná pro nasazení, kde:
Je potřeba zveřejnit server přímo na internetu bez použití služby IIS.
Interní nasazení vyžaduje funkci, ve které Kestrelnení k dispozici . Další informace najdete v tématu Kestrel vs. HTTP.sys
HTTP.sys je vyspělá technologie, která chrání před mnoha typy útoků a poskytuje robustnost, zabezpečení a škálovatelnost plnohodnotného webového serveru. Služba IIS sama běží jako naslouchací proces HTTP nad HTTP.sys.
Podpora HTTP/2
Protokol HTTP/2 je povolený pro aplikace ASP.NET Core, pokud jsou splněny následující základní požadavky:
- Windows Server 2016 / Windows 10 nebo novější
- Připojení k vyjednávání protokolu aplikační vrstvy (ALPN)
- Připojení přes protokol TLS 1.2 nebo novější
Pokud se naváže připojení HTTP/2, vlastnost HttpRequest.Protocol bude obsahovat hodnotu HTTP/2.
Ve výchozím nastavení je protokol HTTP/2 povolený. Pokud není navázáno připojení HTTP/2, připojení se vrátí zpět na HTTP/1.1. V budoucí verzi Windows budou k dispozici příznaky konfigurace HTTP/2, včetně možnosti zakázat HTTP/2 s HTTP.sys.
Podpora HTTP/3
Protokol HTTP/3 je povolený pro aplikace ASP.NET Core, pokud jsou splněny následující základní požadavky:
- Windows Server 2022/Windows 11 nebo novější
- Používá se
httpsvazba adresy URL. - Klíč registru EnableHttp3 je nastavený.
Předchozí verze buildu Windows 11 mohou vyžadovat použití buildu Windows Insider .
Http/3 se zjistí jako upgrade z HTTP/1.1 nebo HTTP/2 prostřednictvím hlavičky alt-svc . To znamená, že první požadavek bude před přepnutím na HTTP/3 normálně používat HTTP/1.1 nebo HTTP/2. Http.Sys automaticky nepřidá hlavičku alt-svc , musí ji přidat aplikace. Následující kód je příklad middlewaru, který přidá hlavičku alt-svc odpovědi.
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
Umístěte předchozí kód v rané fázi kanálu požadavku.
Http.Sys také podporuje odesílání zprávy protokolu ALTSvc HTTP/2 místo hlavičky odpovědi, aby klient informoval, že je k dispozici HTTP/3. Viz klíč registru EnableAltSvc. To vyžaduje vazby netsh sslcert, které používají názvy hostitelů místo IP adres.
Ověřování v režimu jádra s protokolem Kerberos
HTTP.sys deleguje ověřování v režimu jádra pomocí ověřovacího protokolu Kerberos. Ověřování v uživatelském režimu se nepodporuje s protokolem Kerberos a HTTP.sys. Účet počítače se musí použít k dešifrování tokenu protokolu Kerberos nebo lístku získaného ze služby Active Directory a předání klienta na server k ověření uživatele. Zaregistrujte hlavní název služby (SPN) pro hostitele, ne uživatele aplikace.
Podpora ukládání odpovědí v režimu jádra do vyrovnávací paměti
V některých scénářích můžou velké objemy malých zápisů s vysokou latencí způsobit významný dopad na HTTP.sysvýkon . Tento dopad je způsoben nedostatkem Pipe vyrovnávací paměti v implementaci HTTP.sys . Pro zlepšení výkonu v těchto scénářích je zahrnuta podpora ukládání odpovědí do HTTP.sysvyrovnávací paměti . Povolte ukládání do vyrovnávací paměti nastavením httpSysOptions.EnableKernelResponseBuffering na true.
Ukládání odpovědí do vyrovnávací paměti by měla být povolena aplikací, která provádí synchronní vstupně-výstupní operace nebo asynchronní vstupně-výstupní operace s maximálně jedním nevyřízeným zápisem najednou. V těchto scénářích může ukládání odpovědí do vyrovnávací paměti výrazně zlepšit propustnost u připojení s vysokou latencí.
Aplikace, které používají asynchronní vstupně-výstupní operace a které můžou mít najednou více než jeden zápis, by tento příznak neměl používat. Povolením tohoto příznaku může dojít k vyššímu využití procesoru a paměti protokolem HTTP.Sys.
Jak používat HTTP.sys
Nakonfigurujte aplikaci ASP.NET Core tak, aby používala HTTP.sys
Při sestavování hostitele zavolejte metodu UseHttpSys rozšíření a určete požadované HttpSysOptions. Následující příklad nastaví možnosti na výchozí hodnoty:
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30_000_000;
options.UrlPrefixes.Add("http://localhost:5005");
});
builder.Services.AddRazorPages();
var app = builder.Build();
Další konfigurace HTTP.sys se zpracovává prostřednictvím nastavení registru.
Další informace o možnostech HTTP.sys naleznete v tématu HttpSysOptions.
Přizpůsobení popisovačů zabezpečení
Fronta požadavků ve HTTP.sys je struktura na úrovni jádra, která dočasně ukládá příchozí požadavky HTTP, dokud nebude vaše aplikace připravená je zpracovat. Spravujte přístup k frontě požadavků pomocí vlastnosti RequestQueueSecurityDescriptor na HttpSysOptions. Nastavte ji na GenericSecurityDescriptor instanci při konfiguraci HTTP.sys serveru.
Přizpůsobením popisovače zabezpečení můžete povolit nebo odepřít přístup ke frontě žádostí konkrétním uživatelům nebo skupinám. To je užitečné ve scénářích, kdy chcete omezit nebo delegovat HTTP.sys zpracování požadavků na úrovni operačního systému.
Následující kód například umožňuje přístup všem ověřeným uživatelům, ale odmítá hosty.
using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.AspNetCore.Server.HttpSys;
// Create a new security descriptor
var securityDescriptor = new CommonSecurityDescriptor(isContainer: false, isDS: false, sddlForm: string.Empty);
// Create a discretionary access control list (DACL)
var dacl = new DiscretionaryAcl(isContainer: false, isDS: false, capacity: 2);
dacl.AddAccess(
AccessControlType.Allow,
new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),
-1,
InheritanceFlags.None,
PropagationFlags.None
);
dacl.AddAccess(
AccessControlType.Deny,
new SecurityIdentifier(WellKnownSidType.BuiltinGuestsSid, null),
-1,
InheritanceFlags.None,
PropagationFlags.None
);
// Assign the DACL to the security descriptor
securityDescriptor.DiscretionaryAcl = dacl;
// Configure HTTP.sys options
var builder = WebApplication.CreateBuilder();
builder.WebHost.UseHttpSys(options =>
{
options.RequestQueueSecurityDescriptor = securityDescriptor;
});
Tato RequestQueueSecurityDescriptor vlastnost se vztahuje pouze při vytváření nové fronty požadavků. Tato vlastnost nemá vliv na existující fronty požadavků.
MaxRequestBodySize
Maximální povolená velikost libovolného textu požadavku v bajtech. Pokud je nastavená hodnota null, maximální velikost textu požadavku je neomezená. Tento limit nemá žádný vliv na upgradovaná připojení, která jsou vždy neomezená.
Doporučená metoda přepsání limitu v aplikaci ASP.NET Core MVC pro jednu IActionResult metodu je použít RequestSizeLimitAttribute atribut pro metodu akce:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Pokud se aplikace pokusí nakonfigurovat limit požadavku poté, co aplikace začne číst požadavek, vyvolá se výjimka.
IsReadOnly Vlastnost lze použít k označení, jestli MaxRequestBodySize je vlastnost ve stavu jen pro čtení, což znamená, že je příliš pozdě na konfiguraci limitu.
Pokud by aplikace měla přepsat MaxRequestBodySize jednotlivé požadavky, použijte:IHttpMaxRequestBodySizeFeature
app.Use((context, next) =>
{
context.Features.GetRequiredFeature<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var server = context.RequestServices
.GetRequiredService<IServer>();
var serverAddressesFeature = server.Features
.GetRequiredFeature<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature.Addresses);
var loggerFactory = context.RequestServices
.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
logger.LogInformation("Addresses: {addresses}", addresses);
return next(context);
});
Pokud používáte Visual Studio, ujistěte se, že aplikace není nakonfigurovaná tak, aby spouštěla službu IIS nebo IIS Express.
V sadě Visual Studio je výchozí spouštěcí profil pro službu IIS Express. Pokud chcete projekt spustit jako konzolovou aplikaci, ručně změňte vybraný profil, jak je znázorněno na následujícím snímku obrazovky:
Konfigurace Windows Serveru
Určete porty, které se mají otevřít pro aplikaci, a pomocí brány Windows Firewall nebo rutiny Prostředí PowerShell New-NetFirewallRule otevřete porty brány firewall, které umožní přístup k HTTP.sys. V následujících příkazech a konfiguraci aplikace se používá port 443.
Při nasazování na virtuální počítač Azure otevřete porty ve skupině zabezpečení sítě. V následujících příkazech a konfiguraci aplikace se používá port 443.
V případě potřeby získejte a nainstalujte certifikáty X.509.
Ve Windows vytvořte certifikáty podepsané svým držitelem pomocí rutiny New-SelfSignedCertificate PowerShellu. Nepodporovaný příklad najdete v tématu UpdateIISExpressSSLForChrome.ps1.
Nainstalujte certifikáty podepsané svým držitelem nebo certifikáty podepsané certifikační autoritou do osobního úložiště místního počítače> serveru.
Pokud je aplikace nasazení závislé na frameworku, nainstalujte .NET, .NET Framework nebo obojí (pokud se jedná o aplikaci pro .NET, která cílí na .NET Framework).
- .NET: Pokud aplikace vyžaduje .NET, získejte a spusťte instalační program .NET Runtime ze souborů ke stažení .NET. Neinstalujte úplnou sadu SDK na server.
- .NET Framework: Pokud aplikace vyžaduje rozhraní .NET Framework, projděte si průvodce instalací rozhraní .NET Framework. Nainstalujte požadované rozhraní .NET Framework. Instalační program pro nejnovější rozhraní .NET Framework je k dispozici na stránce stažení .NET .
Pokud se jedná o samostatné nasazení, zahrne aplikace do svého nasazení modul runtime. Na serveru není nutná žádná instalace architektury.
Nakonfigurujte adresy URL a porty v aplikaci.
Ve výchozím nastavení ASP.NET Core vytvoří vazbu na
http://localhost:5000. Pokud chcete nakonfigurovat předpony adres URL a porty, patří mezi ně tyto možnosti:- UseUrls
-
urlsArgument příkazového řádku -
ASPNETCORE_URLSproměnná prostředí - UrlPrefixes
Následující příklad kódu ukazuje, jak použít UrlPrefixes s místní IP adresou
10.0.0.4serveru na portu 443:var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); builder.Services.AddRazorPages(); var app = builder.Build();Výhodou
UrlPrefixesje, že se okamžitě vygeneruje chybová zpráva pro nesprávně formátované předpony.Nastavení v
UrlPrefixesnastavení přepsáníUseUrls/urls/ASPNETCORE_URLS. Proto je výhodouUseUrls,urlsaASPNETCORE_URLSproměnná prostředí je, že je jednodušší přepínat mezi Kestrel a HTTP.sys.HTTP.sys rozpoznává dva typy zástupných znaků v předponách adresy URL:
-
*je slabá vazba, označovaná také jako záložní vazba. Pokud jehttp://*:5000předpona adresy URL a něco jiného je vázané na port 5000, tato vazba se nepoužije. -
+je silná vazba. Pokud jehttp://+:5000předpona adresy URL, použije se tato vazba před jinými vazbami portu 5000.
Další informace naleznete v tématu UrlPrefix Strings.
Warning
Vazby nejvyšší úrovně se zástupnými znaky (
http://*:80/ahttp://+:80) by se neměly používat. Vazby zástupných znaků nejvyšší úrovně vytvářejí ohrožení zabezpečení aplikací. Týká se to silných i slabých zástupných znaků. Místo zástupných znaků použijte explicitní názvy hostitelů nebo IP adresy. Vazby zástupných znaků subdomény (například*.mysub.com) nejsou bezpečnostními riziky, pokud řídíte celou nadřazenou doménu (na rozdíl od*.comohrožení zabezpečení). Další informace naleznete v dokumentu RFC 9110: Oddíl 7.2: Hostitel a :authority.Aplikace a kontejnery mají často jenom port pro naslouchání, jako je port 80, bez dalších omezení, jako je hostitel nebo cesta. HTTP_PORTS a HTTPS_PORTS jsou konfigurační klíče, které určují porty naslouchání pro Kestrel servery a servery HTTP.sys. Tyto klíče mohou být zadány jako proměnné prostředí definované s
DOTNET_předponami neboASPNETCORE_zadané přímo prostřednictvím jakéhokoli jiného vstupu konfigurace, napříkladappsettings.json. Každý z nich je seznam hodnot portů oddělený středníkem, jak je znázorněno v následujícím příkladu:ASPNETCORE_HTTP_PORTS=80;8080 ASPNETCORE_HTTPS_PORTS=443;8081Předchozí příklad je zkratka pro následující konfiguraci, která určuje schéma (HTTP nebo HTTPS) a libovolného hostitele nebo IP adresy.
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/Konfigurační klíče HTTP_PORTS a HTTPS_PORTS mají nižší prioritu a jsou přepsány adresami URL nebo hodnotami zadanými přímo v kódu. Certifikáty je stále potřeba nakonfigurovat samostatně prostřednictvím mechaniky specifické pro server pro PROTOKOL HTTPS.
Tyto konfigurační klíče jsou ekvivalentní vazbám zástupných znaků nejvyšší úrovně. Jsou vhodné pro scénáře vývoje a kontejneru, ale při spouštění na počítači, který může hostovat i jiné služby, se vyhněte zástupným znakům.
Předregistrujte předpony adresy URL na serveru.
Integrovaný nástroj pro konfiguraci HTTP.sys je netsh.exe. netsh.exe slouží k rezervaci předpon adres URL a přiřazení certifikátů X.509. Nástroj vyžaduje oprávnění správce.
Pomocí nástroje netsh.exe zaregistrujte adresy URL aplikace:
netsh http add urlacl url=<URL> user=<USER>-
<URL>: Plně kvalifikovaná adresa URL (Uniform Resource Locator). Nepoužívejte vazbu se zástupným znakem. Použijte platný název hostitele nebo místní IP adresu. Adresa URL musí obsahovat koncové lomítko. -
<USER>: Určuje název uživatele nebo skupiny uživatelů.
V následujícím příkladu je
10.0.0.4místní IP adresa serveru:netsh http add urlacl url=https://10.0.0.4:443/ user=UsersPři registraci adresy URL nástroj odpoví .
URL reservation successfully addedPokud chcete odstranit registrovanou adresu URL, použijte příkaz
delete urlacl:netsh http delete urlacl url=<URL>-
Zaregistrujte certifikáty X.509 na serveru.
Pomocí nástroje netsh.exe zaregistrujte certifikáty pro aplikaci:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"-
<IP>: Určuje místní IP adresu vazby. Nepoužívejte vazbu se zástupným znakem. Použijte platnou IP adresu. -
<PORT>: Určuje port pro vazbu. -
<THUMBPRINT>: Kryptografický otisk certifikátu X.509. -
<GUID>: Identifikátor GUID vygenerovaný vývojářem, který představuje aplikaci pro informační účely.
Pro referenční účely uložte identifikátor GUID v aplikaci jako značku balíčku:
- V sadě Visual Studio:
- Otevřete vlastnosti projektu aplikace tak, že kliknete pravým tlačítkem myši na aplikaci v Průzkumník řešení a vyberete Vlastnosti.
- Vyberte kartu Balíček.
- Do pole Značky zadejte identifikátor GUID, který jste vytvořili.
- Pokud nepoužíváte Visual Studio:
Otevřete soubor projektu aplikace.
<PackageTags>Přidejte vlastnost do nového nebo existujícího<PropertyGroup>identifikátoru GUID, který jste vytvořili:<PropertyGroup> <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags> </PropertyGroup>
V následujícím příkladu:
- Místní IP adresa serveru je
10.0.0.4. - Hodnota poskytuje online generátor náhodných identifikátorů
appidGUID.
netsh http add sslcert ipport=10.0.0.4:443 certhash=b66ee04419d4ee37464ab8785ff02449980eae10 appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"Při registraci certifikátu nástroj odpoví
SSL Certificate successfully added.Pokud chcete odstranit registraci certifikátu, použijte příkaz
delete sslcert:netsh http delete sslcert ipport=<IP>:<PORT>Referenční dokumentace pro netsh.exe:
-
Spustit aplikaci.
Oprávnění správce nejsou nutná ke spuštění aplikace při vytváření vazby k místnímu hostiteli pomocí protokolu HTTP (ne HTTPS) s číslem portu větším než 1024. V případě jiných konfigurací (například pomocí místní IP adresy nebo vazby na port 443) spusťte aplikaci s oprávněními správce.
Aplikace odpoví na veřejnou IP adresu serveru. V tomto příkladu se server dostane z internetu na jeho veřejné IP adrese
104.214.79.47.V tomto příkladu se používá vývojový certifikát. Stránka se po vynechání upozornění nedůvěryhodného certifikátu prohlížeče bezpečně načte.
Scénáře týkající se proxy serveru a nástroje pro vyrovnávání zatížení
U aplikací hostovaných HTTP.sys, které pracují s požadavky z internetu nebo podnikové sítě, může být při hostování za proxy servery a nástroji pro vyrovnávání zatížení potřeba další konfigurace. Další informace najdete v tématu Konfigurace ASP.NET Core pro práci s proxy servery a nástroji pro vyrovnávání zatížení.
Získání podrobných informací o načasování pomocí IHttpSysRequestTimingFeature
IHttpSysRequestTimingFeature poskytuje podrobné informace o načasování požadavků:
- Časové razítka se získávají pomocí QueryPerformanceCounter.
- Frekvenci časového razítka lze získat prostřednictvím QueryPerformanceFrequency.
- Index časování lze přetypovat na HttpSysRequestTimingType , abyste věděli, co časování představuje.
- Hodnota může být 0, pokud není pro aktuální požadavek k dispozici časování.
- Vyžaduje Windows 10 verze 2004, Windows Server 2022 nebo novější.
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timestamps = feature.Timestamps;
for (var i = 0; i < timestamps.Length; i++)
{
var timestamp = timestamps[i];
var timingType = (HttpSysRequestTimingType)i;
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
IHttpSysRequestTimingFeature.TryGetTimestamp načte časové razítko pro zadaný typ časování:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetTimestamp(timingType, out var timestamp))
{
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
else
{
logger.LogInformation("Timestamp {timingType}: not available for the "
+ "current request", timingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
[IHttpSysRequestTimingFeature.TryGetElapsedTime](/dotnet/api/microsoft.aspnetcore.server.httpsys.ihttpsysrequesttimingfeature.trygetelapsedtime poskytuje uplynulý čas mezi dvěma zadanými časy:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var startingTimingType = HttpSysRequestTimingType.RequestRoutingStart;
var endingTimingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetElapsedTime(startingTimingType, endingTimingType, out var elapsed))
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}: {elapsed}",
startingTimingType,
endingTimingType,
elapsed);
}
else
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}:"
+ " not available for the current request.",
startingTimingType,
endingTimingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
Pokročilé funkce HTTP/2 pro podporu gRPC
Další funkce HTTP/2 v HTTP.sys podporují gRPC, včetně podpory pro přívěsy odpovědí a odesílání resetování rámců.
Požadavky na spuštění gRPC s HTTP.sys:
- Windows 11 Build 22000 nebo novější, Windows Server 2022 Build 20348 nebo novější.
- Připojení TLS 1.2 nebo novější
Trailers
Přívěsy HTTP se podobají hlavičce HTTP, s výjimkou toho, že se odešlou po odeslání textu odpovědi. Pro službu IIS a HTTP.sys jsou podporovány pouze přívěsy odpovědí HTTP/2.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
V předchozím ukázkovém kódu:
-
SupportsTrailerszajišťuje, aby byly pro odpověď podporovány přívěsy. -
DeclareTrailerpřidá daný název přívěsu do hlavičkyTrailerodpovědi. Deklarování přívěsů odpovědí je volitelné, ale doporučuje se. PokudDeclareTrailerje volána, musí být před odesláním hlaviček odpovědi. -
AppendTrailerpřipojí přívěs.
Reset
Resetování umožňuje serveru resetovat požadavek HTTP/2 se zadaným kódem chyby. Žádost o resetování se považuje za přerušenou.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset v předchozím příkladu kódu určuje INTERNAL_ERROR kód chyby. Další informace o kódech chyb HTTP/2 najdete v části kód chyby specifikace HTTP/2.
Tracing
Informace o tom, jak získat trasování z HTTP.sys, najdete v tématu HTTP.sys Scénáře správy.
Automatické vyřazení z fondu paměti
Fondy paměti používané službou Kestrel, IIS a HTTP.sys automaticky vyřadit bloky paměti, když je aplikace nečinná nebo pod nízkým zatížením. Funkce se spustí automaticky a nemusí být povolená ani nakonfigurovaná ručně.
Ve verzích .NET starších než 10 zůstává paměť přidělená fondem vyhrazena, i když se nepoužívá. Tato funkce automatického vyřazení snižuje celkové využití paměti a pomáhá aplikacím reagovat v různých úlohách.
Použití metrik fondu paměti
Výchozí fond paměti používaný implementacemi serveru ASP.NET Core zahrnuje metriky, které lze použít k monitorování a analýze vzorců využití paměti. Metriky jsou pod názvem "Microsoft.AspNetCore.MemoryPool".
Informace o metrikách a jejich použití najdete v tématu ASP.NET Základní metriky.
Správa fondů paměti
Kromě efektivního používání fondů paměti vyřazením nepotřebných bloků paměti poskytuje ASP.NET Core integrovanou technologii IMemoryPoolFactory a implementaci. Zpřístupňuje implementaci vaší aplikaci prostřednictvím injektáže závislostí.
Následující příklad kódu ukazuje jednoduchou službu na pozadí, která k vytvoření fondů paměti používá integrovanou továrnu na fondy paměti. Tyto fondy využívají funkci automatického vyřazení:
public class MyBackgroundService : BackgroundService
{
private readonly MemoryPool<byte> _memoryPool;
public MyBackgroundService(IMemoryPoolFactory<byte> factory)
{
_memoryPool = factory.Create();
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
await Task.Delay(20, stoppingToken);
// do work that needs memory
// consider checking _memoryPool.MaxBufferSize
var rented = _memoryPool.Rent(100);
rented.Dispose();
}
catch (OperationCanceledException)
{
return;
}
}
}
}
Pokud chcete použít vlastní objekt pro vytváření fondů paměti, vytvořte třídu, která ji implementuje IMemoryPoolFactory a zaregistruje pomocí injektáže závislostí, jak je znázorněno v následujícím příkladu. Fondy paměti vytvořené tímto způsobem také využívají funkci automatického vyřazení:
services.AddSingleton<IMemoryPoolFactory<byte>,
CustomMemoryPoolFactory>();
public class CustomMemoryPoolFactory : IMemoryPoolFactory<byte>
{
public MemoryPool<byte> Create()
{
// Return a custom MemoryPool implementation
// or the default, as is shown here.
return MemoryPool<byte>.Shared;
}
}
Pokud používáte fond paměti, mějte na paměti, že fond MaxBufferSizeje .
Dodatečné zdroje
HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. HTTP.sys je alternativou k Kestrel serveru a nabízí některé funkce, které Kestrel neposkytují.
Important
HTTP.sys není kompatibilní s modulem ASP.NET Core a nejde ho používat se službou IIS nebo IIS Express.
HTTP.sys podporuje následující funkce:
- Ověřování systému Windows
- Sdílení portů
- HTTPS s SNI
- HTTP/2 přes TLS (Windows 10 nebo novější)
- Přímý přenos souborů
- Ukládání odpovědí do mezipaměti
- WebSockets (Windows 8 nebo novější)
Podporované verze Windows:
- Windows 7 nebo novější
- Windows Server 2008 R2 nebo novější
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Kdy použít HTTP.sys
HTTP.sys je užitečná pro nasazení, kde:
Je potřeba zveřejnit server přímo na internetu bez použití služby IIS.
Interní nasazení vyžaduje funkci, ve které Kestrelnení k dispozici . Další informace najdete v tématu Kestrel vs. HTTP.sys
HTTP.sys je vyspělá technologie, která chrání před mnoha typy útoků a poskytuje robustnost, zabezpečení a škálovatelnost plnohodnotného webového serveru. Služba IIS sama běží jako naslouchací proces HTTP nad HTTP.sys.
Podpora HTTP/2
Protokol HTTP/2 je povolený pro aplikace ASP.NET Core, pokud jsou splněny následující základní požadavky:
- Windows Server 2016 / Windows 10 nebo novější
- Připojení k vyjednávání protokolu aplikační vrstvy (ALPN)
- Připojení přes protokol TLS 1.2 nebo novější
Pokud se naváže připojení HTTP/2, vlastnost HttpRequest.Protocol bude obsahovat hodnotu HTTP/2.
Ve výchozím nastavení je protokol HTTP/2 povolený. Pokud není navázáno připojení HTTP/2, připojení se vrátí zpět na HTTP/1.1. V budoucí verzi Windows budou k dispozici příznaky konfigurace HTTP/2, včetně možnosti zakázat HTTP/2 s HTTP.sys.
Podpora HTTP/3
Protokol HTTP/3 je povolený pro aplikace ASP.NET Core, pokud jsou splněny následující základní požadavky:
- Windows Server 2022/Windows 11 nebo novější
- Používá se
httpsvazba adresy URL. - Klíč registru EnableHttp3 je nastavený.
Předchozí verze buildu Windows 11 mohou vyžadovat použití buildu Windows Insider .
Http/3 se zjistí jako upgrade z HTTP/1.1 nebo HTTP/2 prostřednictvím hlavičky alt-svc . To znamená, že první požadavek bude před přepnutím na HTTP/3 normálně používat HTTP/1.1 nebo HTTP/2. Http.Sys automaticky nepřidá hlavičku alt-svc , musí ji přidat aplikace. Následující kód je příklad middlewaru, který přidá hlavičku alt-svc odpovědi.
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
Umístěte předchozí kód v rané fázi kanálu požadavku.
Http.Sys také podporuje odesílání zprávy protokolu ALTSvc HTTP/2 místo hlavičky odpovědi, aby klient informoval, že je k dispozici HTTP/3. Viz klíč registru EnableAltSvc. To vyžaduje vazby netsh sslcert, které používají názvy hostitelů místo IP adres.
Ověřování v režimu jádra s protokolem Kerberos
HTTP.sys deleguje ověřování v režimu jádra pomocí ověřovacího protokolu Kerberos. Ověřování v uživatelském režimu se nepodporuje s protokolem Kerberos a HTTP.sys. Účet počítače se musí použít k dešifrování tokenu protokolu Kerberos nebo lístku získaného ze služby Active Directory a předání klienta na server k ověření uživatele. Zaregistrujte hlavní název služby (SPN) pro hostitele, ne uživatele aplikace.
Jak používat HTTP.sys
Nakonfigurujte aplikaci ASP.NET Core tak, aby používala HTTP.sys
Při sestavování hostitele zavolejte metodu UseHttpSys rozšíření a určete požadované HttpSysOptions. Následující příklad nastaví možnosti na výchozí hodnoty:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
Další konfigurace HTTP.sys se zpracovává prostřednictvím nastavení registru.
Další informace o možnostech HTTP.sys naleznete v tématu HttpSysOptions.
MaxRequestBodySize
Maximální povolená velikost libovolného textu požadavku v bajtech. Pokud je nastavená hodnota null, maximální velikost textu požadavku je neomezená. Tento limit nemá žádný vliv na upgradovaná připojení, která jsou vždy neomezená.
Doporučená metoda přepsání limitu v aplikaci ASP.NET Core MVC pro jednu IActionResult metodu je použít RequestSizeLimitAttribute atribut pro metodu akce:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Pokud se aplikace pokusí nakonfigurovat limit požadavku poté, co aplikace začne číst požadavek, vyvolá se výjimka.
IsReadOnly Vlastnost lze použít k označení, jestli MaxRequestBodySize je vlastnost ve stavu jen pro čtení, což znamená, že je příliš pozdě na konfiguraci limitu.
Pokud by aplikace měla přepsat MaxRequestBodySize jednotlivé požadavky, použijte:IHttpMaxRequestBodySizeFeature
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Pokud používáte Visual Studio, ujistěte se, že aplikace není nakonfigurovaná tak, aby spouštěla službu IIS nebo IIS Express.
V sadě Visual Studio je výchozí spouštěcí profil pro službu IIS Express. Pokud chcete projekt spustit jako konzolovou aplikaci, ručně změňte vybraný profil, jak je znázorněno na následujícím snímku obrazovky:
Konfigurace Windows Serveru
Určete porty, které se mají otevřít pro aplikaci, a pomocí brány Windows Firewall nebo rutiny Prostředí PowerShell New-NetFirewallRule otevřete porty brány firewall, které umožní přístup k HTTP.sys. V následujících příkazech a konfiguraci aplikace se používá port 443.
Při nasazování na virtuální počítač Azure otevřete porty ve skupině zabezpečení sítě. V následujících příkazech a konfiguraci aplikace se používá port 443.
V případě potřeby získejte a nainstalujte certifikáty X.509.
Ve Windows vytvořte certifikáty podepsané svým držitelem pomocí rutiny New-SelfSignedCertificate PowerShellu. Nepodporovaný příklad najdete v tématu UpdateIISExpressSSLForChrome.ps1.
Nainstalujte certifikáty podepsané svým držitelem nebo certifikáty podepsané certifikační autoritou do osobního úložiště místního počítače> serveru.
Pokud je aplikace nasazení závislé na frameworku, nainstalujte .NET, .NET Framework nebo obojí (pokud se jedná o aplikaci pro .NET, která cílí na .NET Framework).
- .NET: Pokud aplikace vyžaduje .NET, získejte a spusťte instalační program .NET Runtime ze souborů ke stažení .NET. Neinstalujte úplnou sadu SDK na server.
- .NET Framework: Pokud aplikace vyžaduje rozhraní .NET Framework, projděte si průvodce instalací rozhraní .NET Framework. Nainstalujte požadované rozhraní .NET Framework. Instalační program pro nejnovější rozhraní .NET Framework je k dispozici na stránce stažení .NET .
Pokud se jedná o samostatné nasazení, zahrne aplikace do svého nasazení modul runtime. Na serveru není nutná žádná instalace architektury.
Nakonfigurujte adresy URL a porty v aplikaci.
Ve výchozím nastavení ASP.NET Core vytvoří vazbu na
http://localhost:5000. Pokud chcete nakonfigurovat předpony adres URL a porty, patří mezi ně tyto možnosti:- UseUrls
-
urlsArgument příkazového řádku -
ASPNETCORE_URLSproměnná prostředí - UrlPrefixes
Následující příklad kódu ukazuje, jak použít UrlPrefixes s místní IP adresou
10.0.0.4serveru na portu 443:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); webBuilder.UseStartup<Startup>(); });Výhodou
UrlPrefixesje, že se okamžitě vygeneruje chybová zpráva pro nesprávně formátované předpony.Nastavení v
UrlPrefixesnastavení přepsáníUseUrls/urls/ASPNETCORE_URLS. Proto je výhodouUseUrls,urlsaASPNETCORE_URLSproměnná prostředí je, že je jednodušší přepínat mezi Kestrel a HTTP.sys.HTTP.sys používá formáty řetězců URLPrefixu rozhraní API HTTP Serveru.
Warning
Vazby nejvyšší úrovně se zástupnými znaky (
http://*:80/ahttp://+:80) by se neměly používat. Vazby zástupných znaků nejvyšší úrovně vytvářejí ohrožení zabezpečení aplikací. Týká se to silných i slabých zástupných znaků. Místo zástupných znaků použijte explicitní názvy hostitelů nebo IP adresy. Vazby zástupných znaků subdomény (například*.mysub.com) nejsou bezpečnostními riziky, pokud řídíte celou nadřazenou doménu (na rozdíl od*.comohrožení zabezpečení). Další informace naleznete v dokumentu RFC 9110: Oddíl 7.2: Hostitel a :authority.Předregistrujte předpony adresy URL na serveru.
Integrovaný nástroj pro konfiguraci HTTP.sys je netsh.exe. netsh.exe slouží k rezervaci předpon adres URL a přiřazení certifikátů X.509. Nástroj vyžaduje oprávnění správce.
Pomocí nástroje netsh.exe zaregistrujte adresy URL aplikace:
netsh http add urlacl url=<URL> user=<USER>-
<URL>: Plně kvalifikovaná adresa URL (Uniform Resource Locator). Nepoužívejte vazbu se zástupným znakem. Použijte platný název hostitele nebo místní IP adresu. Adresa URL musí obsahovat koncové lomítko. -
<USER>: Určuje název uživatele nebo skupiny uživatelů.
V následujícím příkladu je
10.0.0.4místní IP adresa serveru:netsh http add urlacl url=https://10.0.0.4:443/ user=UsersPři registraci adresy URL nástroj odpoví .
URL reservation successfully addedPokud chcete odstranit registrovanou adresu URL, použijte příkaz
delete urlacl:netsh http delete urlacl url=<URL>-
Zaregistrujte certifikáty X.509 na serveru.
Pomocí nástroje netsh.exe zaregistrujte certifikáty pro aplikaci:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"-
<IP>: Určuje místní IP adresu vazby. Nepoužívejte vazbu se zástupným znakem. Použijte platnou IP adresu. -
<PORT>: Určuje port pro vazbu. -
<THUMBPRINT>: Kryptografický otisk certifikátu X.509. -
<GUID>: Identifikátor GUID vygenerovaný vývojářem, který představuje aplikaci pro informační účely.
Pro referenční účely uložte identifikátor GUID v aplikaci jako značku balíčku:
- V sadě Visual Studio:
- Otevřete vlastnosti projektu aplikace tak, že kliknete pravým tlačítkem myši na aplikaci v Průzkumník řešení a vyberete Vlastnosti.
- Vyberte kartu Balíček.
- Do pole Značky zadejte identifikátor GUID, který jste vytvořili.
- Pokud nepoužíváte Visual Studio:
Otevřete soubor projektu aplikace.
<PackageTags>Přidejte vlastnost do nového nebo existujícího<PropertyGroup>identifikátoru GUID, který jste vytvořili:<PropertyGroup> <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags> </PropertyGroup>
V následujícím příkladu:
- Místní IP adresa serveru je
10.0.0.4. - Hodnota poskytuje online generátor náhodných identifikátorů
appidGUID.
netsh http add sslcert ipport=10.0.0.4:443 certhash=b66ee04419d4ee37464ab8785ff02449980eae10 appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"Při registraci certifikátu nástroj odpoví
SSL Certificate successfully added.Pokud chcete odstranit registraci certifikátu, použijte příkaz
delete sslcert:netsh http delete sslcert ipport=<IP>:<PORT>Referenční dokumentace pro netsh.exe:
-
Spustit aplikaci.
Oprávnění správce nejsou nutná ke spuštění aplikace při vytváření vazby k místnímu hostiteli pomocí protokolu HTTP (ne HTTPS) s číslem portu větším než 1024. V případě jiných konfigurací (například pomocí místní IP adresy nebo vazby na port 443) spusťte aplikaci s oprávněními správce.
Aplikace odpoví na veřejnou IP adresu serveru. V tomto příkladu se server dostane z internetu na jeho veřejné IP adrese
104.214.79.47.V tomto příkladu se používá vývojový certifikát. Stránka se po vynechání upozornění nedůvěryhodného certifikátu prohlížeče bezpečně načte.
Scénáře týkající se proxy serveru a nástroje pro vyrovnávání zatížení
U aplikací hostovaných HTTP.sys, které pracují s požadavky z internetu nebo podnikové sítě, může být při hostování za proxy servery a nástroji pro vyrovnávání zatížení potřeba další konfigurace. Další informace najdete v tématu Konfigurace ASP.NET Core pro práci s proxy servery a nástroji pro vyrovnávání zatížení.
Pokročilé funkce HTTP/2 pro podporu gRPC
Další funkce HTTP/2 v HTTP.sys podporují gRPC, včetně podpory pro přívěsy odpovědí a odesílání resetování rámců.
Požadavky na spuštění gRPC s HTTP.sys:
- Windows 11 Build 22000 nebo novější, Windows Server 2022 Build 20348 nebo novější.
- Připojení TLS 1.2 nebo novější
Trailers
Přívěsy HTTP se podobají hlavičce HTTP, s výjimkou toho, že se odešlou po odeslání textu odpovědi. Pro službu IIS a HTTP.sys jsou podporovány pouze přívěsy odpovědí HTTP/2.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
V předchozím ukázkovém kódu:
-
SupportsTrailerszajišťuje, aby byly pro odpověď podporovány přívěsy. -
DeclareTrailerpřidá daný název přívěsu do hlavičkyTrailerodpovědi. Deklarování přívěsů odpovědí je volitelné, ale doporučuje se. PokudDeclareTrailerje volána, musí být před odesláním hlaviček odpovědi. -
AppendTrailerpřipojí přívěs.
Reset
Resetování umožňuje serveru resetovat požadavek HTTP/2 se zadaným kódem chyby. Žádost o resetování se považuje za přerušenou.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset v předchozím příkladu kódu určuje INTERNAL_ERROR kód chyby. Další informace o kódech chyb HTTP/2 najdete v části kód chyby specifikace HTTP/2.
Dodatečné zdroje
HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. HTTP.sys je alternativou k Kestrel serveru a nabízí některé funkce, které Kestrel neposkytují.
Important
HTTP.sys není kompatibilní s modulem ASP.NET Core a nejde ho používat se službou IIS nebo IIS Express.
HTTP.sys podporuje následující funkce:
- Ověřování systému Windows
- Sdílení portů
- HTTPS s SNI
- HTTP/2 přes TLS (Windows 10 nebo novější)
- Přímý přenos souborů
- Ukládání odpovědí do mezipaměti
- WebSockets (Windows 8 nebo novější)
Podporované verze Windows:
- Windows 7 nebo novější
- Windows Server 2008 R2 nebo novější
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Kdy použít HTTP.sys
HTTP.sys je užitečná pro nasazení, kde:
Je potřeba zveřejnit server přímo na internetu bez použití služby IIS.
Interní nasazení vyžaduje funkci, ve které Kestrelnení k dispozici . Další informace najdete v tématu Kestrel vs. HTTP.sys
HTTP.sys je vyspělá technologie, která chrání před mnoha typy útoků a poskytuje robustnost, zabezpečení a škálovatelnost plnohodnotného webového serveru. Služba IIS sama běží jako naslouchací proces HTTP nad HTTP.sys.
Podpora HTTP/2
Protokol HTTP/2 je povolený pro aplikace ASP.NET Core, pokud jsou splněny následující základní požadavky:
- Windows Server 2016 / Windows 10 nebo novější
- Připojení k vyjednávání protokolu aplikační vrstvy (ALPN)
- Připojení přes protokol TLS 1.2 nebo novější
Pokud se naváže připojení HTTP/2, vlastnost HttpRequest.Protocol bude obsahovat hodnotu HTTP/2.
Ve výchozím nastavení je protokol HTTP/2 povolený. Pokud není navázáno připojení HTTP/2, připojení se vrátí zpět na HTTP/1.1. V budoucí verzi Windows budou k dispozici příznaky konfigurace HTTP/2, včetně možnosti zakázat HTTP/2 s HTTP.sys.
Ověřování v režimu jádra s protokolem Kerberos
HTTP.sys deleguje ověřování v režimu jádra pomocí ověřovacího protokolu Kerberos. Ověřování v uživatelském režimu se nepodporuje s protokolem Kerberos a HTTP.sys. Účet počítače se musí použít k dešifrování tokenu protokolu Kerberos nebo lístku získaného ze služby Active Directory a předání klienta na server k ověření uživatele. Zaregistrujte hlavní název služby (SPN) pro hostitele, ne uživatele aplikace.
Jak používat HTTP.sys
Nakonfigurujte aplikaci ASP.NET Core tak, aby používala HTTP.sys
Při sestavování hostitele zavolejte metodu UseHttpSys rozšíření a určete požadované HttpSysOptions. Následující příklad nastaví možnosti na výchozí hodnoty:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
Další konfigurace HTTP.sys se zpracovává prostřednictvím nastavení registru.
možnostiHTTP.sys
| Property | Description | Default |
|---|---|---|
| AllowSynchronousIO | Určuje, zda je povolen synchronní vstup a výstup pro a HttpContext.Request.BodyHttpContext.Response.Body. |
false |
| Authentication.AllowAnonymous | Povolit anonymní požadavky. | true |
| Authentication.Schemes | Zadejte povolená schémata ověřování. Před zveřejněním naslouchacího procesu může být kdykoli změněn. Hodnoty jsou poskytovány pomocí výčtu AuthenticationSchemes: Basic, Kerberos, Negotiate, Nonea NTLM. |
None |
| EnableResponseCaching | Pokuste se ukládání do mezipaměti v režimu jádra pro odpovědi s oprávněnými hlavičkami. Odpověď nesmí obsahovat Set-Cookie, Varyani Pragma hlavičky. Musí obsahovat hlavičku Cache-Control , která je public a buď shared-max-agemax-age nebo hodnota, nebo hlavičku Expires . |
true |
| Http503Verbosity | Chování HTTP.sys při odmítnutí požadavků z důvodu podmínek omezování. |
Http503VerbosityLevel. Základní |
| MaxAccepts | Maximální počet souběžných přijímá. | 5 × Prostředí. PočetProcesorů |
| MaxConnections | Maximální počet souběžných připojení, která se mají přijmout. Slouží -1 k nekonečnému použití. Slouží null k použití nastavení celého počítače registru. |
null(machine-wide setting) |
| MaxRequestBodySize | Viz část MaxRequestBodySize. | 30000000 bajtů (~28,6 MB) |
| RequestQueueLimit | Maximální počet požadavků, které je možné zařadit do fronty. | 1000 |
RequestQueueMode |
Určuje, jestli je server zodpovědný za vytvoření a konfiguraci fronty požadavků, nebo jestli se má připojit k existující frontě. Většina existujících možností konfigurace se nepoužije při připojování k existující frontě. |
RequestQueueMode.Create |
RequestQueueName |
Název fronty požadavků HTTP.sys. |
null (Anonymní fronta) |
| ThrowWriteExceptions | Uveďte, jestli tělo odpovědi zapisuje, že selhání kvůli odpojení klienta by mělo vyvolat výjimky nebo je normálně dokončit. | false(normálně) |
| Timeouts | Zveřejnění konfigurace HTTP.sys TimeoutManager , která může být také nakonfigurována v registru. Další informace o jednotlivých nastaveních, včetně výchozích hodnot, najdete na odkazech rozhraní API:
|
|
| UrlPrefixes | Zadejte, jak UrlPrefixCollection se má zaregistrovat v HTTP.sys. Nejužitečnější je UrlPrefixCollection.Add, který se používá k přidání předpony do kolekce. Tyto změny mohou být změněny kdykoli před zveřejněním naslouchacího procesu. |
MaxRequestBodySize
Maximální povolená velikost libovolného textu požadavku v bajtech. Pokud je nastavená hodnota null, maximální velikost textu požadavku je neomezená. Tento limit nemá žádný vliv na upgradovaná připojení, která jsou vždy neomezená.
Doporučená metoda přepsání limitu v aplikaci ASP.NET Core MVC pro jednu IActionResult metodu je použít RequestSizeLimitAttribute atribut pro metodu akce:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Pokud se aplikace pokusí nakonfigurovat limit požadavku poté, co aplikace začne číst požadavek, vyvolá se výjimka.
IsReadOnly Vlastnost lze použít k označení, jestli MaxRequestBodySize je vlastnost ve stavu jen pro čtení, což znamená, že je příliš pozdě na konfiguraci limitu.
Pokud by aplikace měla přepsat MaxRequestBodySize jednotlivé požadavky, použijte:IHttpMaxRequestBodySizeFeature
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
Pokud používáte Visual Studio, ujistěte se, že aplikace není nakonfigurovaná tak, aby spouštěla službu IIS nebo IIS Express.
V sadě Visual Studio je výchozí spouštěcí profil pro službu IIS Express. Pokud chcete projekt spustit jako konzolovou aplikaci, ručně změňte vybraný profil, jak je znázorněno na následujícím snímku obrazovky:
Konfigurace Windows Serveru
Určete porty, které se mají otevřít pro aplikaci, a pomocí brány Windows Firewall nebo rutiny Prostředí PowerShell New-NetFirewallRule otevřete porty brány firewall, které umožní přístup k HTTP.sys. V následujících příkazech a konfiguraci aplikace se používá port 443.
Při nasazování na virtuální počítač Azure otevřete porty ve skupině zabezpečení sítě. V následujících příkazech a konfiguraci aplikace se používá port 443.
V případě potřeby získejte a nainstalujte certifikáty X.509.
Ve Windows vytvořte certifikáty podepsané svým držitelem pomocí rutiny New-SelfSignedCertificate PowerShellu. Nepodporovaný příklad najdete v tématu UpdateIISExpressSSLForChrome.ps1.
Nainstalujte certifikáty podepsané svým držitelem nebo certifikáty podepsané certifikační autoritou do osobního úložiště místního počítače> serveru.
Pokud je aplikace nasazení závislé na frameworku, nainstalujte .NET, .NET Framework nebo obojí (pokud se jedná o aplikaci pro .NET, která cílí na .NET Framework).
- .NET: Pokud aplikace vyžaduje .NET, získejte a spusťte instalační program .NET Runtime ze souborů ke stažení .NET. Neinstalujte úplnou sadu SDK na server.
- .NET Framework: Pokud aplikace vyžaduje rozhraní .NET Framework, projděte si průvodce instalací rozhraní .NET Framework. Nainstalujte požadované rozhraní .NET Framework. Instalační program pro nejnovější rozhraní .NET Framework je k dispozici na stránce stažení .NET .
Pokud se jedná o samostatné nasazení, zahrne aplikace do svého nasazení modul runtime. Na serveru není nutná žádná instalace architektury.
Nakonfigurujte adresy URL a porty v aplikaci.
Ve výchozím nastavení ASP.NET Core vytvoří vazbu na
http://localhost:5000. Pokud chcete nakonfigurovat předpony adres URL a porty, patří mezi ně tyto možnosti:- UseUrls
-
urlsArgument příkazového řádku -
ASPNETCORE_URLSproměnná prostředí - UrlPrefixes
Následující příklad kódu ukazuje, jak použít UrlPrefixes s místní IP adresou
10.0.0.4serveru na portu 443:public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); webBuilder.UseStartup<Startup>(); });Výhodou
UrlPrefixesje, že se okamžitě vygeneruje chybová zpráva pro nesprávně formátované předpony.Nastavení v
UrlPrefixesnastavení přepsáníUseUrls/urls/ASPNETCORE_URLS. Proto je výhodouUseUrls,urlsaASPNETCORE_URLSproměnná prostředí je, že je jednodušší přepínat mezi Kestrel a HTTP.sys.HTTP.sys používá formáty řetězců URLPrefixu rozhraní API HTTP Serveru.
Warning
Vazby nejvyšší úrovně se zástupnými znaky (
http://*:80/ahttp://+:80) by se neměly používat. Vazby zástupných znaků nejvyšší úrovně vytvářejí ohrožení zabezpečení aplikací. Týká se to silných i slabých zástupných znaků. Místo zástupných znaků použijte explicitní názvy hostitelů nebo IP adresy. Vazby zástupných znaků subdomény (například*.mysub.com) nejsou bezpečnostními riziky, pokud řídíte celou nadřazenou doménu (na rozdíl od*.comohrožení zabezpečení). Další informace naleznete v dokumentu RFC 9110: Oddíl 7.2: Hostitel a :authority.Předregistrujte předpony adresy URL na serveru.
Integrovaný nástroj pro konfiguraci HTTP.sys je netsh.exe. netsh.exe slouží k rezervaci předpon adres URL a přiřazení certifikátů X.509. Nástroj vyžaduje oprávnění správce.
Pomocí nástroje netsh.exe zaregistrujte adresy URL aplikace:
netsh http add urlacl url=<URL> user=<USER>-
<URL>: Plně kvalifikovaná adresa URL (Uniform Resource Locator). Nepoužívejte vazbu se zástupným znakem. Použijte platný název hostitele nebo místní IP adresu. Adresa URL musí obsahovat koncové lomítko. -
<USER>: Určuje název uživatele nebo skupiny uživatelů.
V následujícím příkladu je
10.0.0.4místní IP adresa serveru:netsh http add urlacl url=https://10.0.0.4:443/ user=UsersPři registraci adresy URL nástroj odpoví .
URL reservation successfully addedPokud chcete odstranit registrovanou adresu URL, použijte příkaz
delete urlacl:netsh http delete urlacl url=<URL>-
Zaregistrujte certifikáty X.509 na serveru.
Pomocí nástroje netsh.exe zaregistrujte certifikáty pro aplikaci:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"-
<IP>: Určuje místní IP adresu vazby. Nepoužívejte vazbu se zástupným znakem. Použijte platnou IP adresu. -
<PORT>: Určuje port pro vazbu. -
<THUMBPRINT>: Kryptografický otisk certifikátu X.509. -
<GUID>: Identifikátor GUID vygenerovaný vývojářem, který představuje aplikaci pro informační účely.
Pro referenční účely uložte identifikátor GUID v aplikaci jako značku balíčku:
- V sadě Visual Studio:
- Otevřete vlastnosti projektu aplikace tak, že kliknete pravým tlačítkem myši na aplikaci v Průzkumník řešení a vyberete Vlastnosti.
- Vyberte kartu Balíček.
- Do pole Značky zadejte identifikátor GUID, který jste vytvořili.
- Pokud nepoužíváte Visual Studio:
Otevřete soubor projektu aplikace.
<PackageTags>Přidejte vlastnost do nového nebo existujícího<PropertyGroup>identifikátoru GUID, který jste vytvořili:<PropertyGroup> <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags> </PropertyGroup>
V následujícím příkladu:
- Místní IP adresa serveru je
10.0.0.4. - Hodnota poskytuje online generátor náhodných identifikátorů
appidGUID.
netsh http add sslcert ipport=10.0.0.4:443 certhash=b66ee04419d4ee37464ab8785ff02449980eae10 appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"Při registraci certifikátu nástroj odpoví
SSL Certificate successfully added.Pokud chcete odstranit registraci certifikátu, použijte příkaz
delete sslcert:netsh http delete sslcert ipport=<IP>:<PORT>Referenční dokumentace pro netsh.exe:
-
Spustit aplikaci.
Oprávnění správce nejsou nutná ke spuštění aplikace při vytváření vazby k místnímu hostiteli pomocí protokolu HTTP (ne HTTPS) s číslem portu větším než 1024. V případě jiných konfigurací (například pomocí místní IP adresy nebo vazby na port 443) spusťte aplikaci s oprávněními správce.
Aplikace odpoví na veřejnou IP adresu serveru. V tomto příkladu se server dostane z internetu na jeho veřejné IP adrese
104.214.79.47.V tomto příkladu se používá vývojový certifikát. Stránka se po vynechání upozornění nedůvěryhodného certifikátu prohlížeče bezpečně načte.
Scénáře týkající se proxy serveru a nástroje pro vyrovnávání zatížení
U aplikací hostovaných HTTP.sys, které pracují s požadavky z internetu nebo podnikové sítě, může být při hostování za proxy servery a nástroji pro vyrovnávání zatížení potřeba další konfigurace. Další informace najdete v tématu Konfigurace ASP.NET Core pro práci s proxy servery a nástroji pro vyrovnávání zatížení.
Pokročilé funkce HTTP/2 pro podporu gRPC
Další funkce HTTP/2 v HTTP.sys podporují gRPC, včetně podpory pro přívěsy odpovědí a odesílání resetování rámců.
Požadavky na spuštění gRPC s HTTP.sys:
- Windows 10, build operačního systému 19041.508 nebo novější
- Připojení přes protokol TLS 1.2 nebo novější
Trailers
Přívěsy HTTP se podobají hlavičce HTTP, s výjimkou toho, že se odešlou po odeslání textu odpovědi. Pro službu IIS a HTTP.sys jsou podporovány pouze přívěsy odpovědí HTTP/2.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
V předchozím ukázkovém kódu:
-
SupportsTrailerszajišťuje, aby byly pro odpověď podporovány přívěsy. -
DeclareTrailerpřidá daný název přívěsu do hlavičkyTrailerodpovědi. Deklarování přívěsů odpovědí je volitelné, ale doporučuje se. PokudDeclareTrailerje volána, musí být před odesláním hlaviček odpovědi. -
AppendTrailerpřipojí přívěs.
Reset
Resetování umožňuje serveru resetovat požadavek HTTP/2 se zadaným kódem chyby. Žádost o resetování se považuje za přerušenou.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset v předchozím příkladu kódu určuje INTERNAL_ERROR kód chyby. Další informace o kódech chyb HTTP/2 najdete v části kód chyby specifikace HTTP/2.
Dodatečné zdroje
HTTP.sys je webový server pro ASP.NET Core, který běží jenom ve Windows. HTTP.sys je alternativou k Kestrel serveru a nabízí některé funkce, které Kestrel neposkytují.
Important
HTTP.sys není kompatibilní s modulem ASP.NET Core a nejde ho používat se službou IIS nebo IIS Express.
HTTP.sys podporuje následující funkce:
- Ověřování systému Windows
- Sdílení portů
- HTTPS s SNI
- HTTP/2 přes TLS (Windows 10 nebo novější)
- HTTP/3 přes TLS (Windows 11 nebo novější)
- Přímý přenos souborů
- Ukládání odpovědí do mezipaměti
- WebSockets (Windows 8 nebo novější)
- Přizpůsobitelné popisovače zabezpečení
Podporované verze Windows:
- Windows 7 nebo novější
- Windows Server 2008 R2 nebo novější
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Kdy použít HTTP.sys
HTTP.sys je užitečná pro nasazení, kde:
Je potřeba zveřejnit server přímo na internetu bez použití služby IIS.
Interní nasazení vyžaduje funkci, ve které Kestrelnení k dispozici . Další informace najdete v tématu Kestrel vs. HTTP.sys
HTTP.sys je vyspělá technologie, která chrání před mnoha typy útoků a poskytuje robustnost, zabezpečení a škálovatelnost plnohodnotného webového serveru. Služba IIS sama běží jako naslouchací proces HTTP nad HTTP.sys.
Podpora HTTP/2
Protokol HTTP/2 je povolený pro aplikace ASP.NET Core, pokud jsou splněny následující základní požadavky:
- Windows Server 2016 / Windows 10 nebo novější
- Připojení k vyjednávání protokolu aplikační vrstvy (ALPN)
- Připojení přes protokol TLS 1.2 nebo novější
Pokud se naváže připojení HTTP/2, vlastnost HttpRequest.Protocol bude obsahovat hodnotu HTTP/2.
Ve výchozím nastavení je protokol HTTP/2 povolený. Pokud není navázáno připojení HTTP/2, připojení se vrátí zpět na HTTP/1.1. V budoucí verzi Windows budou k dispozici příznaky konfigurace HTTP/2, včetně možnosti zakázat HTTP/2 s HTTP.sys.
Podpora HTTP/3
Protokol HTTP/3 je povolený pro aplikace ASP.NET Core, pokud jsou splněny následující základní požadavky:
- Windows Server 2022/Windows 11 nebo novější
- Používá se
httpsvazba adresy URL. - Klíč registru EnableHttp3 je nastavený.
Předchozí verze buildu Windows 11 mohou vyžadovat použití buildu Windows Insider .
Http/3 se zjistí jako upgrade z HTTP/1.1 nebo HTTP/2 prostřednictvím hlavičky alt-svc . To znamená, že první požadavek bude před přepnutím na HTTP/3 normálně používat HTTP/1.1 nebo HTTP/2. Http.Sys automaticky nepřidá hlavičku alt-svc , musí ji přidat aplikace. Následující kód je příklad middlewaru, který přidá hlavičku alt-svc odpovědi.
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
Umístěte předchozí kód v rané fázi kanálu požadavku.
Http.Sys také podporuje odesílání zprávy protokolu ALTSvc HTTP/2 místo hlavičky odpovědi, aby klient informoval, že je k dispozici HTTP/3. Viz klíč registru EnableAltSvc. To vyžaduje vazby netsh sslcert, které používají názvy hostitelů místo IP adres.
Ověřování v režimu jádra s protokolem Kerberos
HTTP.sys deleguje ověřování v režimu jádra pomocí ověřovacího protokolu Kerberos. Ověřování v uživatelském režimu se nepodporuje s protokolem Kerberos a HTTP.sys. Účet počítače se musí použít k dešifrování tokenu protokolu Kerberos nebo lístku získaného ze služby Active Directory a předání klienta na server k ověření uživatele. Zaregistrujte hlavní název služby (SPN) pro hostitele, ne uživatele aplikace.
Podpora ukládání odpovědí v režimu jádra do vyrovnávací paměti
V některých scénářích můžou velké objemy malých zápisů s vysokou latencí způsobit významný dopad na HTTP.sysvýkon . Tento dopad je způsoben nedostatkem Pipe vyrovnávací paměti v implementaci HTTP.sys . Pro zlepšení výkonu v těchto scénářích je zahrnuta podpora ukládání odpovědí do HTTP.sysvyrovnávací paměti . Povolte ukládání do vyrovnávací paměti nastavením httpSysOptions.EnableKernelResponseBuffering na true.
Ukládání odpovědí do vyrovnávací paměti by měla být povolena aplikací, která provádí synchronní vstupně-výstupní operace nebo asynchronní vstupně-výstupní operace s maximálně jedním nevyřízeným zápisem najednou. V těchto scénářích může ukládání odpovědí do vyrovnávací paměti výrazně zlepšit propustnost u připojení s vysokou latencí.
Aplikace, které používají asynchronní vstupně-výstupní operace a které můžou mít najednou více než jeden zápis, by tento příznak neměl používat. Povolením tohoto příznaku může dojít k vyššímu využití procesoru a paměti protokolem HTTP.Sys.
Jak používat HTTP.sys
Nakonfigurujte aplikaci ASP.NET Core tak, aby používala HTTP.sys
Při sestavování hostitele zavolejte metodu UseHttpSys rozšíření a určete požadované HttpSysOptions. Následující příklad nastaví možnosti na výchozí hodnoty:
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30_000_000;
options.UrlPrefixes.Add("http://localhost:5005");
});
builder.Services.AddRazorPages();
var app = builder.Build();
Další konfigurace HTTP.sys se zpracovává prostřednictvím nastavení registru.
Další informace o možnostech HTTP.sys naleznete v tématu HttpSysOptions.
MaxRequestBodySize
Maximální povolená velikost libovolného textu požadavku v bajtech. Pokud je nastavená hodnota null, maximální velikost textu požadavku je neomezená. Tento limit nemá žádný vliv na upgradovaná připojení, která jsou vždy neomezená.
Doporučená metoda přepsání limitu v aplikaci ASP.NET Core MVC pro jednu IActionResult metodu je použít RequestSizeLimitAttribute atribut pro metodu akce:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
Pokud se aplikace pokusí nakonfigurovat limit požadavku poté, co aplikace začne číst požadavek, vyvolá se výjimka.
IsReadOnly Vlastnost lze použít k označení, jestli MaxRequestBodySize je vlastnost ve stavu jen pro čtení, což znamená, že je příliš pozdě na konfiguraci limitu.
Pokud by aplikace měla přepsat MaxRequestBodySize jednotlivé požadavky, použijte:IHttpMaxRequestBodySizeFeature
app.Use((context, next) =>
{
context.Features.GetRequiredFeature<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var server = context.RequestServices
.GetRequiredService<IServer>();
var serverAddressesFeature = server.Features
.GetRequiredFeature<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature.Addresses);
var loggerFactory = context.RequestServices
.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
logger.LogInformation("Addresses: {addresses}", addresses);
return next(context);
});
Pokud používáte Visual Studio, ujistěte se, že aplikace není nakonfigurovaná tak, aby spouštěla službu IIS nebo IIS Express.
V sadě Visual Studio je výchozí spouštěcí profil pro službu IIS Express. Pokud chcete projekt spustit jako konzolovou aplikaci, ručně změňte vybraný profil, jak je znázorněno na následujícím snímku obrazovky:
Konfigurace Windows Serveru
Určete porty, které se mají otevřít pro aplikaci, a pomocí brány Windows Firewall nebo rutiny Prostředí PowerShell New-NetFirewallRule otevřete porty brány firewall, které umožní přístup k HTTP.sys. V následujících příkazech a konfiguraci aplikace se používá port 443.
Při nasazování na virtuální počítač Azure otevřete porty ve skupině zabezpečení sítě. V následujících příkazech a konfiguraci aplikace se používá port 443.
V případě potřeby získejte a nainstalujte certifikáty X.509.
Ve Windows vytvořte certifikáty podepsané svým držitelem pomocí rutiny New-SelfSignedCertificate PowerShellu. Nepodporovaný příklad najdete v tématu UpdateIISExpressSSLForChrome.ps1.
Nainstalujte certifikáty podepsané svým držitelem nebo certifikáty podepsané certifikační autoritou do osobního úložiště místního počítače> serveru.
Pokud je aplikace nasazení závislé na frameworku, nainstalujte .NET, .NET Framework nebo obojí (pokud se jedná o aplikaci pro .NET, která cílí na .NET Framework).
- .NET: Pokud aplikace vyžaduje .NET, získejte a spusťte instalační program .NET Runtime ze souborů ke stažení .NET. Neinstalujte úplnou sadu SDK na server.
- .NET Framework: Pokud aplikace vyžaduje rozhraní .NET Framework, projděte si průvodce instalací rozhraní .NET Framework. Nainstalujte požadované rozhraní .NET Framework. Instalační program pro nejnovější rozhraní .NET Framework je k dispozici na stránce stažení .NET .
Pokud se jedná o samostatné nasazení, zahrne aplikace do svého nasazení modul runtime. Na serveru není nutná žádná instalace architektury.
Nakonfigurujte adresy URL a porty v aplikaci.
Ve výchozím nastavení ASP.NET Core vytvoří vazbu na
http://localhost:5000. Pokud chcete nakonfigurovat předpony adres URL a porty, patří mezi ně tyto možnosti:- UseUrls
-
urlsArgument příkazového řádku -
ASPNETCORE_URLSproměnná prostředí - UrlPrefixes
Následující příklad kódu ukazuje, jak použít UrlPrefixes s místní IP adresou
10.0.0.4serveru na portu 443:var builder = WebApplication.CreateBuilder(args); builder.WebHost.UseHttpSys(options => { options.UrlPrefixes.Add("https://10.0.0.4:443"); }); builder.Services.AddRazorPages(); var app = builder.Build();Výhodou
UrlPrefixesje, že se okamžitě vygeneruje chybová zpráva pro nesprávně formátované předpony.Nastavení v
UrlPrefixesnastavení přepsáníUseUrls/urls/ASPNETCORE_URLS. Proto je výhodouUseUrls,urlsaASPNETCORE_URLSproměnná prostředí je, že je jednodušší přepínat mezi Kestrel a HTTP.sys.HTTP.sys rozpoznává dva typy zástupných znaků v předponách adresy URL:
-
*je slabá vazba, označovaná také jako záložní vazba. Pokud jehttp://*:5000předpona adresy URL a něco jiného je vázané na port 5000, tato vazba se nepoužije. -
+je silná vazba. Pokud jehttp://+:5000předpona adresy URL, použije se tato vazba před jinými vazbami portu 5000.
Další informace naleznete v tématu UrlPrefix Strings.
Warning
Vazby nejvyšší úrovně se zástupnými znaky (
http://*:80/ahttp://+:80) by se neměly používat. Vazby zástupných znaků nejvyšší úrovně vytvářejí ohrožení zabezpečení aplikací. Týká se to silných i slabých zástupných znaků. Místo zástupných znaků použijte explicitní názvy hostitelů nebo IP adresy. Vazby zástupných znaků subdomény (například*.mysub.com) nejsou bezpečnostními riziky, pokud řídíte celou nadřazenou doménu (na rozdíl od*.comohrožení zabezpečení). Další informace naleznete v dokumentu RFC 9110: Oddíl 7.2: Hostitel a :authority.Aplikace a kontejnery mají často jenom port pro naslouchání, jako je port 80, bez dalších omezení, jako je hostitel nebo cesta. HTTP_PORTS a HTTPS_PORTS jsou konfigurační klíče, které určují porty naslouchání pro Kestrel servery a servery HTTP.sys. Tyto klíče mohou být zadány jako proměnné prostředí definované s
DOTNET_předponami neboASPNETCORE_zadané přímo prostřednictvím jakéhokoli jiného vstupu konfigurace, napříkladappsettings.json. Každý z nich je seznam hodnot portů oddělený středníkem, jak je znázorněno v následujícím příkladu:ASPNETCORE_HTTP_PORTS=80;8080 ASPNETCORE_HTTPS_PORTS=443;8081Předchozí příklad je zkratka pro následující konfiguraci, která určuje schéma (HTTP nebo HTTPS) a libovolného hostitele nebo IP adresy.
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/Konfigurační klíče HTTP_PORTS a HTTPS_PORTS mají nižší prioritu a jsou přepsány adresami URL nebo hodnotami zadanými přímo v kódu. Certifikáty je stále potřeba nakonfigurovat samostatně prostřednictvím mechaniky specifické pro server pro PROTOKOL HTTPS.
Tyto konfigurační klíče jsou ekvivalentní vazbám zástupných znaků nejvyšší úrovně. Jsou vhodné pro scénáře vývoje a kontejneru, ale při spouštění na počítači, který může hostovat i jiné služby, se vyhněte zástupným znakům.
Předregistrujte předpony adresy URL na serveru.
Integrovaný nástroj pro konfiguraci HTTP.sys je netsh.exe. netsh.exe slouží k rezervaci předpon adres URL a přiřazení certifikátů X.509. Nástroj vyžaduje oprávnění správce.
Pomocí nástroje netsh.exe zaregistrujte adresy URL aplikace:
netsh http add urlacl url=<URL> user=<USER>-
<URL>: Plně kvalifikovaná adresa URL (Uniform Resource Locator). Nepoužívejte vazbu se zástupným znakem. Použijte platný název hostitele nebo místní IP adresu. Adresa URL musí obsahovat koncové lomítko. -
<USER>: Určuje název uživatele nebo skupiny uživatelů.
V následujícím příkladu je
10.0.0.4místní IP adresa serveru:netsh http add urlacl url=https://10.0.0.4:443/ user=UsersPři registraci adresy URL nástroj odpoví .
URL reservation successfully addedPokud chcete odstranit registrovanou adresu URL, použijte příkaz
delete urlacl:netsh http delete urlacl url=<URL>-
Zaregistrujte certifikáty X.509 na serveru.
Pomocí nástroje netsh.exe zaregistrujte certifikáty pro aplikaci:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"-
<IP>: Určuje místní IP adresu vazby. Nepoužívejte vazbu se zástupným znakem. Použijte platnou IP adresu. -
<PORT>: Určuje port pro vazbu. -
<THUMBPRINT>: Kryptografický otisk certifikátu X.509. -
<GUID>: Identifikátor GUID vygenerovaný vývojářem, který představuje aplikaci pro informační účely.
Pro referenční účely uložte identifikátor GUID v aplikaci jako značku balíčku:
- V sadě Visual Studio:
- Otevřete vlastnosti projektu aplikace tak, že kliknete pravým tlačítkem myši na aplikaci v Průzkumník řešení a vyberete Vlastnosti.
- Vyberte kartu Balíček.
- Do pole Značky zadejte identifikátor GUID, který jste vytvořili.
- Pokud nepoužíváte Visual Studio:
Otevřete soubor projektu aplikace.
<PackageTags>Přidejte vlastnost do nového nebo existujícího<PropertyGroup>identifikátoru GUID, který jste vytvořili:<PropertyGroup> <PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags> </PropertyGroup>
V následujícím příkladu:
- Místní IP adresa serveru je
10.0.0.4. - Hodnota poskytuje online generátor náhodných identifikátorů
appidGUID.
netsh http add sslcert ipport=10.0.0.4:443 certhash=b66ee04419d4ee37464ab8785ff02449980eae10 appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"Při registraci certifikátu nástroj odpoví
SSL Certificate successfully added.Pokud chcete odstranit registraci certifikátu, použijte příkaz
delete sslcert:netsh http delete sslcert ipport=<IP>:<PORT>Referenční dokumentace pro netsh.exe:
-
Spustit aplikaci.
Oprávnění správce nejsou nutná ke spuštění aplikace při vytváření vazby k místnímu hostiteli pomocí protokolu HTTP (ne HTTPS) s číslem portu větším než 1024. V případě jiných konfigurací (například pomocí místní IP adresy nebo vazby na port 443) spusťte aplikaci s oprávněními správce.
Aplikace odpoví na veřejnou IP adresu serveru. V tomto příkladu se server dostane z internetu na jeho veřejné IP adrese
104.214.79.47.V tomto příkladu se používá vývojový certifikát. Stránka se po vynechání upozornění nedůvěryhodného certifikátu prohlížeče bezpečně načte.
Scénáře týkající se proxy serveru a nástroje pro vyrovnávání zatížení
U aplikací hostovaných HTTP.sys, které pracují s požadavky z internetu nebo podnikové sítě, může být při hostování za proxy servery a nástroji pro vyrovnávání zatížení potřeba další konfigurace. Další informace najdete v tématu Konfigurace ASP.NET Core pro práci s proxy servery a nástroji pro vyrovnávání zatížení.
Získání podrobných informací o načasování pomocí IHttpSysRequestTimingFeature
IHttpSysRequestTimingFeature poskytuje podrobné informace o načasování požadavků:
- Časové razítka se získávají pomocí QueryPerformanceCounter.
- Frekvenci časového razítka lze získat prostřednictvím QueryPerformanceFrequency.
- Index časování lze přetypovat na HttpSysRequestTimingType , abyste věděli, co časování představuje.
- Hodnota může být 0, pokud není pro aktuální požadavek k dispozici časování.
- Vyžaduje Windows 10 verze 2004, Windows Server 2022 nebo novější.
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timestamps = feature.Timestamps;
for (var i = 0; i < timestamps.Length; i++)
{
var timestamp = timestamps[i];
var timingType = (HttpSysRequestTimingType)i;
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
IHttpSysRequestTimingFeature.TryGetTimestamp načte časové razítko pro zadaný typ časování:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetTimestamp(timingType, out var timestamp))
{
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
else
{
logger.LogInformation("Timestamp {timingType}: not available for the "
+ "current request", timingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
[IHttpSysRequestTimingFeature.TryGetElapsedTime](/dotnet/api/microsoft.aspnetcore.server.httpsys.ihttpsysrequesttimingfeature.trygetelapsedtime poskytuje uplynulý čas mezi dvěma zadanými časy:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var startingTimingType = HttpSysRequestTimingType.RequestRoutingStart;
var endingTimingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetElapsedTime(startingTimingType, endingTimingType, out var elapsed))
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}: {elapsed}",
startingTimingType,
endingTimingType,
elapsed);
}
else
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}:"
+ " not available for the current request.",
startingTimingType,
endingTimingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
Pokročilé funkce HTTP/2 pro podporu gRPC
Další funkce HTTP/2 v HTTP.sys podporují gRPC, včetně podpory pro přívěsy odpovědí a odesílání resetování rámců.
Požadavky na spuštění gRPC s HTTP.sys:
- Windows 11 Build 22000 nebo novější, Windows Server 2022 Build 20348 nebo novější.
- Připojení TLS 1.2 nebo novější
Trailers
Přívěsy HTTP se podobají hlavičce HTTP, s výjimkou toho, že se odešlou po odeslání textu odpovědi. Pro službu IIS a HTTP.sys jsou podporovány pouze přívěsy odpovědí HTTP/2.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
V předchozím ukázkovém kódu:
-
SupportsTrailerszajišťuje, aby byly pro odpověď podporovány přívěsy. -
DeclareTrailerpřidá daný název přívěsu do hlavičkyTrailerodpovědi. Deklarování přívěsů odpovědí je volitelné, ale doporučuje se. PokudDeclareTrailerje volána, musí být před odesláním hlaviček odpovědi. -
AppendTrailerpřipojí přívěs.
Reset
Resetování umožňuje serveru resetovat požadavek HTTP/2 se zadaným kódem chyby. Žádost o resetování se považuje za přerušenou.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset v předchozím příkladu kódu určuje INTERNAL_ERROR kód chyby. Další informace o kódech chyb HTTP/2 najdete v části kód chyby specifikace HTTP/2.
Tracing
Informace o tom, jak získat trasování z HTTP.sys, najdete v tématu HTTP.sys Scénáře správy.