Sdílet prostřednictvím


Implementace webového serveru HTTP.sys v ASP.NET Core

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

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í.

Důležité

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.

    HTTP.sys komunikuje přímo s internetem

  • Interní nasazení vyžaduje funkci, ve které Kestrelnení k dispozici . Další informace najdete v tématu Kestrel vs. HTTP.sys

    HTTP.sys komunikuje přímo s interní sítí

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:

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 https vazba 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:

Výběr profilu konzolové aplikace

Konfigurace Windows Serveru

  1. 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.

  2. 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.

  3. 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.

  4. Pokud je aplikace nasazení závislé na rozhraní, nainstalujte .NET Core, .NET Framework nebo obojí (pokud se jedná o aplikaci .NET Core určenou pro .NET Framework).

    • .NET Core: Pokud aplikace vyžaduje .NET Core, získejte a spusťte instalační program .NET Core Runtime ze stažených souborů .NET Core. 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 Core.

    Pokud se jedná o samostatné nasazení, zahrne aplikace do svého nasazení modul runtime. Na serveru není nutná žádná instalace architektury.

  5. 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
    • urls Argument příkazového řádku
    • ASPNETCORE_URLS proměnná prostředí
    • UrlPrefixes

    Následující příklad kódu ukazuje, jak použít UrlPrefixes s místní IP adresou 10.0.0.4 serveru 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 UrlPrefixes je, že se okamžitě vygeneruje chybová zpráva pro nesprávně formátované předpony.

    Nastavení v UrlPrefixes nastavení přepsání/UseUrlsurls/ASPNETCORE_URLS. Proto je výhodou UseUrls, urlsa ASPNETCORE_URLS promě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 je http://*:5000předpona adresy URL a něco jiného je vázané na port 5000, tato vazba se nepoužije.
    • + je silná vazba. Pokud je http://+:5000předpona adresy URL, použije se tato vazba před jinými vazbami portu 5000.

    Další informace naleznete v tématu UrlPrefix Strings.

    Upozorňující

    Vazby nejvyšší úrovně se zástupnými znaky (http://*:80/ a http://+: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 nebo ASPNETCORE_ zadané přímo prostřednictvím jakéhokoli jiného vstupu konfigurace, například appsettings.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;8081
    

    Př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.

  6. 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=Users
    

    Při registraci adresy URL nástroj odpoví .URL reservation successfully added

    Pokud chcete odstranit registrovanou adresu URL, použijte příkaz delete urlacl :

    netsh http delete urlacl url=<URL>
    
  7. 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ů appid GUID.
    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:

  8. 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.

    Okno prohlížeče zobrazující načtenou indexovou stránku aplikace

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 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ší

Přívěsy

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:

  • SupportsTrailers zajišťuje, aby byly pro odpověď podporovány přívěsy.
  • DeclareTrailer přidá daný název přívěsu do hlavičky Trailer odpovědi. Deklarování přívěsů odpovědí je volitelné, ale doporučuje se. Pokud DeclareTrailer je volána, musí být před odesláním hlaviček odpovědi.
  • AppendTrailer př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.

Sledování

Informace o tom, jak získat trasování z HTTP.sys, najdete v tématu HTTP.sys Scénáře správy.

Další materiály

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í.

Důležité

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.

    HTTP.sys komunikuje přímo s internetem

  • Interní nasazení vyžaduje funkci, ve které Kestrelnení k dispozici . Další informace najdete v tématu Kestrel vs. HTTP.sys

    HTTP.sys komunikuje přímo s interní sítí

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:

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 https vazba 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:

Výběr profilu konzolové aplikace

Konfigurace Windows Serveru

  1. 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.

  2. 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.

  3. 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.

  4. Pokud je aplikace nasazení závislé na rozhraní, nainstalujte .NET Core, .NET Framework nebo obojí (pokud se jedná o aplikaci .NET Core určenou pro .NET Framework).

    • .NET Core: Pokud aplikace vyžaduje .NET Core, získejte a spusťte instalační program .NET Core Runtime ze stažených souborů .NET Core. 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 Core.

    Pokud se jedná o samostatné nasazení, zahrne aplikace do svého nasazení modul runtime. Na serveru není nutná žádná instalace architektury.

  5. 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
    • urls Argument příkazového řádku
    • ASPNETCORE_URLS proměnná prostředí
    • UrlPrefixes

    Následující příklad kódu ukazuje, jak použít UrlPrefixes s místní IP adresou 10.0.0.4 serveru 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 UrlPrefixes je, že se okamžitě vygeneruje chybová zpráva pro nesprávně formátované předpony.

    Nastavení v UrlPrefixes nastavení přepsání/UseUrlsurls/ASPNETCORE_URLS. Proto je výhodou UseUrls, urlsa ASPNETCORE_URLS promě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.

    Upozorňující

    Vazby nejvyšší úrovně se zástupnými znaky (http://*:80/ a http://+: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.

  6. 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=Users
    

    Při registraci adresy URL nástroj odpoví .URL reservation successfully added

    Pokud chcete odstranit registrovanou adresu URL, použijte příkaz delete urlacl :

    netsh http delete urlacl url=<URL>
    
  7. 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ů appid GUID.
    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:

  8. 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.

    Okno prohlížeče zobrazující načtenou indexovou stránku aplikace

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ší

Přívěsy

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:

  • SupportsTrailers zajišťuje, aby byly pro odpověď podporovány přívěsy.
  • DeclareTrailer přidá daný název přívěsu do hlavičky Trailer odpovědi. Deklarování přívěsů odpovědí je volitelné, ale doporučuje se. Pokud DeclareTrailer je volána, musí být před odesláním hlaviček odpovědi.
  • AppendTrailer př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.

Další materiály

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í.

Důležité

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.

    HTTP.sys komunikuje přímo s internetem

  • Interní nasazení vyžaduje funkci, ve které Kestrelnení k dispozici . Další informace najdete v tématu Kestrel vs. HTTP.sys

    HTTP.sys komunikuje přímo s interní sítí

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:

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žnosti HTTP.sys

Vlastnost Popis Výchozí
AllowSynchronousIO Určuje, zda je povolen synchronní vstup a výstup pro a HttpContext.Request.Body HttpContext.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-age max-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í.
ProcessorCount
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
(strojově široký
nastavení)
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:

Výběr profilu konzolové aplikace

Konfigurace Windows Serveru

  1. 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.

  2. 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.

  3. 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.

  4. Pokud je aplikace nasazení závislé na rozhraní, nainstalujte .NET Core, .NET Framework nebo obojí (pokud se jedná o aplikaci .NET Core určenou pro .NET Framework).

    • .NET Core: Pokud aplikace vyžaduje .NET Core, získejte a spusťte instalační program .NET Core Runtime ze stažených souborů .NET Core. 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 Core.

    Pokud se jedná o samostatné nasazení, zahrne aplikace do svého nasazení modul runtime. Na serveru není nutná žádná instalace architektury.

  5. 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
    • urls Argument příkazového řádku
    • ASPNETCORE_URLS proměnná prostředí
    • UrlPrefixes

    Následující příklad kódu ukazuje, jak použít UrlPrefixes s místní IP adresou 10.0.0.4 serveru 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 UrlPrefixes je, že se okamžitě vygeneruje chybová zpráva pro nesprávně formátované předpony.

    Nastavení v UrlPrefixes nastavení přepsání/UseUrlsurls/ASPNETCORE_URLS. Proto je výhodou UseUrls, urlsa ASPNETCORE_URLS promě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.

    Upozorňující

    Vazby nejvyšší úrovně se zástupnými znaky (http://*:80/ a http://+: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.

  6. 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=Users
    

    Při registraci adresy URL nástroj odpoví .URL reservation successfully added

    Pokud chcete odstranit registrovanou adresu URL, použijte příkaz delete urlacl :

    netsh http delete urlacl url=<URL>
    
  7. 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ů appid GUID.
    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:

  8. 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.

    Okno prohlížeče zobrazující načtenou indexovou stránku aplikace

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ší

Přívěsy

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:

  • SupportsTrailers zajišťuje, aby byly pro odpověď podporovány přívěsy.
  • DeclareTrailer přidá daný název přívěsu do hlavičky Trailer odpovědi. Deklarování přívěsů odpovědí je volitelné, ale doporučuje se. Pokud DeclareTrailer je volána, musí být před odesláním hlaviček odpovědi.
  • AppendTrailer př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.

Další materiály