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

Tom Dykstra a Chris

HTTP.sys je webový server pro ASP.NET Core, který běží jenom na Windows. HTTP.sys je alternativou k serveru a Kestrel nabízí některé funkce, Kestrel které neposkytuje.

Důležité

HTTP.sys není kompatibilní s modulem ASP.NET Core Module a nelze ho použít 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 protokol 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é Windows verze:

  • Windows 7 nebo novější
  • Windows Server 2008 R2 nebo novější

Zobrazení nebo stažení ukázkového kódu (stažení)

Kdy použít HTTP.sys

HTTP.sys je užitečná pro nasazení, kde:

  • Server je potřeba zveřejnit přímo na internetu bez použití služby IIS.

    HTTP.sys komunikuje přímo s internetem

  • Interní nasazení vyžaduje funkci, která není dostupná v Kestrel nástroji . Další informace najdete v Kestrel tématu vs. HTTP.sys

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

HTTP.sys vyspělá technologie, která chrání před mnoha typy útoků a poskytuje odolnost, zabezpečení a škálovatelnost plně vybaveného webového serveru. Služba IIS samotná běží jako naslouchací proces HTTP nad HTTP.sys.

Podpora HTTP/2

Protokol HTTP/2 je povolený ASP.NET Core aplikací, pokud jsou splněny následující základní požadavky:

Pokud je vytvořeno připojení HTTP/2, protokol HttpRequest.Protocol hlásí HTTP/2 .

Ve výchozím nastavení je povolený protokol HTTP/2. Pokud není připojení HTTP/2 na navázat, připojení se vrátí zpět na HTTP/1.1. V budoucí verzi služby Windows budou k dispozici příznaky konfigurace HTTP/2, včetně možnosti zakázat HTTP/2 pomocí HTTP.sys.

Podpora HTTP/3

Protokol HTTP/3 je povolený ASP.NET Core aplikací, pokud jsou splněny následující základní požadavky:

Předchozí verze Windows 11 sestavení mohou vyžadovat použití sestavení Windows Insider.

Http/3 se prostřednictvím hlavičky objeví jako upgrade z HTTP/1.1 nebo alt-svc HTTP/2. 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 nepřidá alt-svc hlavičku automaticky, musí ji přidat aplikace. Následující kód je příkladem middlewaru, který přidá alt-svc hlavičku odpovědi.

app.Use((context, next) =>
{
    context.Response.Headers.AltSvc = "h3=\":443\"";
    return next(context);
});

Umístěte předchozí kód na začátek kanálu požadavku.

Http.Sys také odesílání zprávy protokolu HTTP/2 AltSvc místo hlavičky odpovědi, která klientovi oznámí, že je k dispozici protokol HTTP/3. Viz klíč registru EnableAltSvc. Všimněte si, že to vyžaduje vazby netsh sslcert, které místo IP adres používají názvy hostitelů.

Ověřování v režimu jádra pomocí protokolu Kerberos

HTTP.sys deleguje na ověřování v režimu jádra pomocí ověřovacího protokolu Kerberos. Ověřování v uživatelském režimu není podporováno protokolem Kerberos a HTTP.sys. Účet počítače se musí použít k dešifrování tokenu nebo lístku Kerberos získaného ze služby Active Directory a předáných klientem serveru k ověření uživatele. Zaregistrujte hlavní název služby (SPN) pro hostitele, ne pro uživatele aplikace.

Jak používat HTTP.sys

Konfigurace ASP.NET Core aplikace pro použití HTTP.sys

Při sestavování UseHttpSys hostitele volejte metodu rozšíření a zadejte všechny 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ší HTTP.sys konfigurace se zpracovávají prostřednictvím nastavení registru.

HTTP.sys možnosti

Vlastnost Popis Výchozí
AllowSynchronousIO Určuje, jestli je pro a povolený synchronní HttpContext.Request.Body HttpContext.Response.Body vstup/výstup. false
Authentication.AllowAnonymous Povolit anonymní požadavky. true
Authentication.Schemes Zadejte povolená schémata ověřování. Před odznáním naslouchacího procesu je možné ho kdykoli upravit. Hodnoty poskytuje výčet AuthenticationSchemes: Basic , Kerberos , , a Negotiate None NTLM . None
EnableResponseCaching Pokuste se o ukládání odpovědí do mezipaměti v režimu jádra s oprávněnými hlavičkami. Odpověď nemusí obsahovat Set-Cookie Vary hlavičky , Pragma nebo . Musí obsahovat Cache-Control hlavičku , která je public a hodnota nebo nebo shared-max-age max-age Expires hlavička. true
Http503Verbosity Toto HTTP.sys chování při zamítání požadavků kvůli podmínkám omezování. Http503VerbosityLevel.
Základní
MaxAccepts Maximální počet souběžných požadavků. 5 × Prostředí.
ProcessorCount
MaxConnections Maximální počet souběžných připojení, která je nutné přijmout. Používejte -1 pro nekonečné. Pomocí null použijte nastavení registru pro celé počítače. null
(pro celé počítače
(nastavení)
MaxRequestBodySize Viz část MaxRequestBodySize. 30000000 bajtů
(~28,6 MB)
RequestQueueLimit Maximální počet požadavků, které lze zařadit do fronty. 1000
RequestQueueMode To určuje, jestli server zodpovídá 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 při připojování k existující frontě nepoužije.
RequestQueueMode.Create
RequestQueueName Název fronty HTTP.sys požadavků. null (Anonymní fronta)
ThrowWriteExceptions Určete, jestli zápisy textu odpovědi, které selžou z důvodu odpojení klienta, by měly vyvolat výjimky nebo by se měly dokončit normálně. false
(normálně dokončeno)
Timeouts Zpřístupňuje HTTP.sys TimeoutManager konfigurace, 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, kam se UrlPrefixCollection má zaregistrovat HTTP.sys. Nejužitečnější je UrlPrefixCollection.Add , který se používá k přidání předpony do kolekce. Ty mohou být kdykoliv změněny předtím, než se naslouchací proces vyřazuje.

MaxRequestBodySize

Maximální povolená velikost libovolného textu žádosti v bajtech Při nastavení na null je maximální velikost textu požadavku neomezená. Toto omezení nemá žádný vliv na upgradovaná připojení, která jsou vždycky neomezená.

doporučená metoda pro přepsání limitu v aplikaci ASP.NET Core MVC pro jeden IActionResult je použít RequestSizeLimitAttribute atribut pro metodu akce:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Výjimka je vyvolána, pokud se aplikace pokusí nakonfigurovat limit žádosti poté, co aplikace začne číst požadavek. IsReadOnlyVlastnost může být použita k označení MaxRequestBodySize , zda je vlastnost ve stavu jen pro čtení, což znamená, že je příliš pozdě pro konfiguraci limitu.

Pokud by měla aplikace 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 Visual Studio je výchozím spouštěcím profilem IIS Express. Chcete-li spustit projekt jako konzolovou aplikaci, ručně změňte vybraný profil, jak je znázorněno na následujícím snímku obrazovky:

Vybrat profil aplikace konzoly

konfigurace serveru Windows

  1. určete porty, které se mají otevřít pro aplikaci, a pomocí rutiny Windows firewall nebo rutiny New-NetFirewallRule prostředí PowerShell otevřete porty brány firewall, aby bylo možné dosáhnout HTTP.sys provozu. 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.

    v Windows vytvořte pomocí rutiny prostředí PowerShell New-SelfSignedCertificatecertifikáty podepsané svým držitelem. Nepodporovaný příklad naleznete v tématu UpdateIISExpressSSLForChrome.ps1.

    Nainstalujte certifikáty podepsané svým držitelem nebo certifikátem podepsaným certifikační autoritou do osobního úložiště místního počítače serveru > .

  4. pokud se jedná o nasazení závislé na rozhraní, nainstalujte rozhraní .net core, .NET Framework nebo obojí (pokud je aplikace aplikace .net core cílící na .NET Framework).

    Pokud je aplikace samostatným nasazením, aplikace zahrne modul runtime do svého nasazení. Na serveru není nutná žádná instalace rozhraní.

  5. Konfigurace adres URL a portů v aplikaci

    ve výchozím nastavení ASP.NET Core váže http://localhost:5000 . Pokud chcete nakonfigurovat předpony a porty adresy URL, můžete použít 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žívat UrlPrefixes s místní IP adresou serveru 10.0.0.4 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ě generuje chybová zpráva pro nesprávně naformátované předpony.

    Nastavení v UrlPrefixes UseUrls / urls / ASPNETCORE_URLS Nastavení přepsání Proto je výhodou UseUrls urls proměnné prostředí, a ASPNETCORE_URLS jednodušší přepínání mezi Kestrel a HTTP.sys.

    HTTP.sys používá formáty řetězce UrlPrefix HTTP serveru API.

    Upozornění

    Nelze použít vazby zástupných znaků na nejvyšší úrovni ( http://*:80/ a http://+:80 ). Vazby na zástupné znaky na nejvyšší úrovni vytvoří chyby zabezpečení aplikace. To platí pro silné i slabé zástupné znaky. Místo zástupných znaků použijte explicitní názvy hostitelů nebo IP adresy. Vazba zástupných znaků subdomény (například *.mysub.com ) není bezpečnostní riziko, pokud ovládáte celou nadřazenou doménu (na rozdíl od *.com , která je zranitelná). Další informace najdete v dokumentu RFC 7230: oddíl 5,4: Host.

  6. Předregistrujte předpony adresy URL na serveru.

    K disnetsh.exe je integrovaný nástroj pro konfiguraci HTTP.sys. netsh.exe se používá k rezervaci předpon adres URL a přiřazování certifikátů X. 509. Nástroj vyžaduje oprávnění správce.

    K registraci adres URL aplikace použijte nástroj netsh.exe :

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: Plně kvalifikované adresy URL (Uniform Resource Locator). Nepoužívejte vazbu zástupných znaků. 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 místní IP adresa serveru 10.0.0.4 :

    netsh http add urlacl url=https://10.0.0.4:443/ user=Users
    

    Když je adresa URL registrována, nástroj odpoví URL reservation successfully added .

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

    netsh http delete urlacl url=<URL>
    
  7. Zaregistrujte certifikáty X. 509 na serveru.

    K registraci certifikátů pro aplikaci použijte nástroj netsh.exe :

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Určuje místní IP adresu pro vazbu. Nepoužívejte vazbu zástupných znaků. Použijte platnou IP adresu.
    • <PORT>: Určuje port pro vazbu.
    • <THUMBPRINT>: Kryptografický otisk certifikátu X. 509.
    • <GUID>: Identifikátor GUID generovaný vývojářem, který představuje aplikaci pro informativní účely.

    Pro referenční účely uložte identifikátor GUID do aplikace jako značku balíčku:

    • V Visual Studio:
      • Otevřete vlastnosti projektu aplikace tak, že kliknete pravým tlačítkem na aplikaci v Průzkumník řešení a vyberete vlastnosti.
      • Vyberte kartu balíček .
      • Zadejte identifikátor GUID, který jste vytvořili v poli značky .
    • Pokud nepoužíváte Visual Studio:
      • Otevřete soubor projektu aplikace.

      • Přidejte <PackageTags> vlastnost do nového nebo existujícího <PropertyGroup> s identifikátorem GUID, který jste vytvořili:

        <PropertyGroup>
          <PackageTags>9412ee86-c21b-4eb8-bd89-f650fbf44931</PackageTags>
        </PropertyGroup>
        

    V následujícím příkladu:

    • Místní IP adresa serveru je 10.0.0.4 .
    • Generátor náhodných identifikátorů GUID online poskytuje appid hodnotu.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Když je certifikát zaregistrován, nástroj odpoví SSL Certificate successfully added .

    K odstranění registrace certifikátu použijte delete sslcert příkaz:

    netsh http delete sslcert ipport=<IP>:<PORT>
    

    Referenční dokumentace pro netsh.exe:

  8. Spusťte aplikaci.

    Oprávnění správce nejsou nutná ke spuštění aplikace při vytváření vazby na localhost pomocí protokolu HTTP (ne HTTPS) s číslem portu větším než 1024. U ostatní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 je server dosažitelný 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 načte bezpečně po obejít upozornění na nedůvěryhodný certifikát v prohlížeči.

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

Scénáře proxy serveru a nástroje pro vyrovnávání zatížení

Pro aplikace hostované HTTP.sys, které komunikují s požadavky z Internetu nebo podnikové sítě, se může při hostování za proxy servery a nástroji pro vyrovnávání zatížení vyžadovat další konfigurace. další informace najdete v tématu konfigurace ASP.NET Core pro práci se servery proxy a nástroji pro vyrovnávání zatížení.

Pokročilé funkce HTTP/2 pro podporu gRPC

Další funkce HTTP/2 v HTTP.sys gRPC, včetně podpory pro hlavičky odpovědí a odesílání snímků resetování.

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í TLS 1.2 nebo novější

Přívěsy

Hlavičky HTTP se podobají hlavičkám HTTP s tím rozdílem, že se odesílaly po odeslání textu odpovědi. Pro IIS a HTTP.sys se podporují pouze hlavičky s 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 příkladu kódu:

  • SupportsTrailers zajišťuje, že odpověď podporuje upoutávky.
  • DeclareTrailer přidá do hlavičky odpovědi daný Trailer název hlavičky. Deklarování upoutávky odpovědi 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í upoutávku.

Resetovat

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

HTTP.sys je webový server pro ASP.NET Core, který běží jenom na Windows. HTTP.sys je alternativou Kestrel k serveru a nabízí některé funkce, Kestrel které neposkytuje.

Důležité

HTTP.sys není kompatibilní s modulem ASP.NET Core a nelze ho použít 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 protokol 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é Windows verze:

  • Windows 7 nebo novější
  • Windows Server 2008 R2 nebo novější

Zobrazení nebo stažení ukázkového kódu (stažení)

Kdy použít HTTP.sys

HTTP.sys je užitečná pro nasazení, kde:

  • Server je potřeba zveřejnit přímo na internetu bez použití služby IIS.

    HTTP.sys komunikuje přímo s internetem

  • Interní nasazení vyžaduje funkci, která není dostupná v Kestrel nástroji . Další informace najdete v Kestrel tématu vs. HTTP.sys

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

HTTP.sys vyspělá technologie, která chrání před mnoha typy útoků a poskytuje odolnost, zabezpečení a škálovatelnost plně vybaveného webového serveru. Samotná služba IIS běží jako naslouchací proces HTTP nad HTTP.sys.

Podpora HTTP/2

Protokol HTTP/2 je pro ASP.NET Core povolený, pokud jsou splněny následující základní požadavky:

Pokud je vytvořeno připojení HTTP/2, protokol HttpRequest.Protocol hlásí HTTP/2 .

Ve výchozím nastavení je povolený protokol HTTP/2. Pokud není připojení HTTP/2 na navázat, připojení se vrátí zpět na HTTP/1.1. V budoucí verzi služby Windows budou k dispozici příznaky konfigurace HTTP/2, včetně možnosti zakázat HTTP/2 pomocí HTTP.sys.

Ověřování v režimu jádra pomocí protokolu Kerberos

HTTP.sys deleguje na ověřování v režimu jádra pomocí ověřovacího protokolu Kerberos. Ověřování v uživatelském režimu není podporováno protokolem Kerberos a HTTP.sys. Účet počítače se musí použít k dešifrování tokenu nebo lístku Kerberos získaného ze služby Active Directory a předáných klientem serveru k ověření uživatele. Zaregistrujte hlavní název služby (SPN) pro hostitele, ne pro uživatele aplikace.

Jak používat HTTP.sys

Konfigurace ASP.NET Core aplikace pro použití HTTP.sys

Při sestavování UseHttpSys hostitele volejte metodu rozšíření a zadejte všechny 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ší HTTP.sys konfigurace se zpracovávají prostřednictvím nastavení registru.

HTTP.sys možnosti

Vlastnost Popis Výchozí
AllowSynchronousIO Určuje, jestli je pro a povolený synchronní HttpContext.Request.Body HttpContext.Response.Body vstup/výstup. false
Authentication.AllowAnonymous Povolit anonymní požadavky. true
Authentication.Schemes Zadejte povolená schémata ověřování. Před odznáním naslouchacího procesu je možné ho kdykoli upravit. Hodnoty poskytuje výčet AuthenticationSchemes: Basic , Kerberos , , a Negotiate None NTLM . None
EnableResponseCaching Pokuste se o ukládání odpovědí do mezipaměti v režimu jádra s oprávněnými hlavičkami. Odpověď nemusí obsahovat Set-Cookie Vary hlavičky , Pragma nebo . Musí obsahovat Cache-Control hlavičku , která je public a hodnota nebo nebo shared-max-age max-age Expires hlavička. true
Http503Verbosity Toto HTTP.sys chování při zamítání požadavků kvůli podmínkám omezování. Http503VerbosityLevel.
Základní
MaxAccepts Maximální počet souběžných požadavků. 5 × Prostředí.
ProcessorCount
MaxConnections Maximální počet souběžných připojení, která je nutné přijmout. Používejte -1 pro nekonečné. Pomocí null použijte nastavení registru pro celé počítače. null
(pro celé počítače
(nastavení)
MaxRequestBodySize Viz část MaxRequestBodySize. 30000000 bajtů
(~28,6 MB)
RequestQueueLimit Maximální počet požadavků, které lze zařadit do fronty. 1000
RequestQueueMode To určuje, jestli server zodpovídá 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 při připojování k existující frontě nepoužije.
RequestQueueMode.Create
RequestQueueName Název fronty HTTP.sys požadavků. null (Anonymní fronta)
ThrowWriteExceptions Určete, jestli zápisy textu odpovědi, které selžou z důvodu odpojení klienta, by měly vyvolat výjimky nebo by se měly dokončit normálně. false
(normálně dokončeno)
Timeouts Zpřístupňuje HTTP.sys TimeoutManager konfigurace, 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 pro UrlPrefixCollection registraci do HTTP.sys. Nejužitečnější UrlPrefixCollection.Add je , který se používá k přidání předpony do kolekce. Tyto změny je možné kdykoli upravit před tím, než se naslouchací proces odsoudí.

MaxRequestBodySize

Maximální povolená velikost libovolného textu žádosti v bajtech Při nastavení na null je maximální velikost textu požadavku neomezená. Toto omezení nemá žádný vliv na upgradovaná připojení, která jsou vždycky neomezená.

doporučená metoda pro přepsání limitu v aplikaci ASP.NET Core MVC pro jeden IActionResult je použít RequestSizeLimitAttribute atribut pro metodu akce:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Výjimka je vyvolána, pokud se aplikace pokusí nakonfigurovat limit žádosti poté, co aplikace začne číst požadavek. IsReadOnlyVlastnost může být použita k označení MaxRequestBodySize , zda je vlastnost ve stavu jen pro čtení, což znamená, že je příliš pozdě pro konfiguraci limitu.

Pokud by měla aplikace 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 Visual Studio je výchozím spouštěcím profilem IIS Express. Chcete-li spustit projekt jako konzolovou aplikaci, ručně změňte vybraný profil, jak je znázorněno na následujícím snímku obrazovky:

Vybrat profil aplikace konzoly

konfigurace serveru Windows

  1. určete porty, které se mají otevřít pro aplikaci, a pomocí rutiny Windows firewall nebo rutiny New-NetFirewallRule prostředí PowerShell otevřete porty brány firewall, aby bylo možné dosáhnout HTTP.sys provozu. 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.

    v Windows vytvořte pomocí rutiny prostředí PowerShell New-SelfSignedCertificatecertifikáty podepsané svým držitelem. Nepodporovaný příklad naleznete v tématu UpdateIISExpressSSLForChrome.ps1.

    Nainstalujte certifikáty podepsané svým držitelem nebo certifikátem podepsaným certifikační autoritou do osobního úložiště místního počítače serveru > .

  4. pokud se jedná o nasazení závislé na rozhraní, nainstalujte rozhraní .net core, .NET Framework nebo obojí (pokud je aplikace aplikace .net core cílící na .NET Framework).

    Pokud je aplikace samostatným nasazením, aplikace zahrne modul runtime do svého nasazení. Na serveru není nutná žádná instalace rozhraní.

  5. Konfigurace adres URL a portů v aplikaci

    ve výchozím nastavení ASP.NET Core váže http://localhost:5000 . Pokud chcete nakonfigurovat předpony a porty adresy URL, můžete použít 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žívat UrlPrefixes s místní IP adresou serveru 10.0.0.4 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ě generuje chybová zpráva pro nesprávně naformátované předpony.

    Nastavení v UrlPrefixes UseUrls / urls / ASPNETCORE_URLS Nastavení přepsání Proto je výhodou UseUrls urls proměnné prostředí, a ASPNETCORE_URLS jednodušší přepínání mezi Kestrel a HTTP.sys.

    HTTP.sys používá formáty řetězce UrlPrefix HTTP serveru API.

    Upozornění

    Nelze použít vazby zástupných znaků na nejvyšší úrovni ( http://*:80/ a http://+:80 ). Vazby na zástupné znaky na nejvyšší úrovni vytvoří chyby zabezpečení aplikace. To platí pro silné i slabé zástupné znaky. Místo zástupných znaků použijte explicitní názvy hostitelů nebo IP adresy. Vazba zástupných znaků subdomény (například *.mysub.com ) není bezpečnostní riziko, pokud ovládáte celou nadřazenou doménu (na rozdíl od *.com , která je zranitelná). Další informace najdete v dokumentu RFC 7230: oddíl 5,4: Host.

  6. Předregistrujte předpony adresy URL na serveru.

    K disnetsh.exe je integrovaný nástroj pro konfiguraci HTTP.sys. netsh.exe se používá k rezervaci předpon adres URL a přiřazování certifikátů X. 509. Nástroj vyžaduje oprávnění správce.

    K registraci adres URL aplikace použijte nástroj netsh.exe :

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: Plně kvalifikované adresy URL (Uniform Resource Locator). Nepoužívejte vazbu zástupných znaků. 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 místní IP adresa serveru 10.0.0.4 :

    netsh http add urlacl url=https://10.0.0.4:443/ user=Users
    

    Když je adresa URL registrována, nástroj odpoví URL reservation successfully added .

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

    netsh http delete urlacl url=<URL>
    
  7. Zaregistrujte certifikáty X. 509 na serveru.

    K registraci certifikátů pro aplikaci použijte nástroj netsh.exe :

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Určuje místní IP adresu pro vazbu. Nepoužívejte vazbu zástupných znaků. Použijte platnou IP adresu.
    • <PORT>: Určuje port pro vazbu.
    • <THUMBPRINT>: Kryptografický otisk certifikátu X. 509.
    • <GUID>: Identifikátor GUID generovaný vývojářem, který představuje aplikaci pro informativní účely.

    Pro referenční účely uložte identifikátor GUID do aplikace jako značku balíčku:

    • V Visual Studio:
      • Otevřete vlastnosti projektu aplikace tak, že kliknete pravým tlačítkem na aplikaci v Průzkumník řešení a vyberete vlastnosti.
      • Vyberte kartu balíček .
      • Zadejte identifikátor GUID, který jste vytvořili v poli značky .
    • Pokud nepoužíváte Visual Studio:
      • Otevřete soubor projektu aplikace.

      • Přidejte <PackageTags> vlastnost do nového nebo existujícího <PropertyGroup> s identifikátorem GUID, který jste vytvořili:

        <PropertyGroup>
          <PackageTags>9412ee86-c21b-4eb8-bd89-f650fbf44931</PackageTags>
        </PropertyGroup>
        

    V následujícím příkladu:

    • Místní IP adresa serveru je 10.0.0.4 .
    • Generátor náhodných identifikátorů GUID online poskytuje appid hodnotu.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Když je certifikát zaregistrován, nástroj odpoví SSL Certificate successfully added .

    K odstranění registrace certifikátu použijte delete sslcert příkaz:

    netsh http delete sslcert ipport=<IP>:<PORT>
    

    Referenční dokumentace pro netsh.exe:

  8. Spusťte aplikaci.

    Oprávnění správce nejsou nutná ke spuštění aplikace při vytváření vazby na localhost pomocí protokolu HTTP (ne HTTPS) s číslem portu větším než 1024. U ostatní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 je server dosažitelný 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 načte bezpečně po obejít upozornění na nedůvěryhodný certifikát v prohlížeči.

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

Scénáře proxy serveru a nástroje pro vyrovnávání zatížení

Pro aplikace hostované HTTP.sys, které komunikují s požadavky z Internetu nebo podnikové sítě, se může při hostování za proxy servery a nástroji pro vyrovnávání zatížení vyžadovat další konfigurace. další informace najdete v tématu konfigurace ASP.NET Core pro práci se servery proxy a nástroji pro vyrovnávání zatížení.

Rozšířené funkce protokolu 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í snímků pro resetování.

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í TLS 1,2 nebo novější

Karoseri

Hlavičky HTTP se podobají hlavičkám HTTP s tím rozdílem, že se odesílaly po odeslání textu odpovědi. Pro IIS a HTTP.sys se podporují pouze hlavičky s 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 příkladu kódu:

  • SupportsTrailers zajišťuje, že odpověď podporuje upoutávky.
  • DeclareTrailer přidá do hlavičky odpovědi daný Trailer název hlavičky. Deklarování upoutávky odpovědi 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í upoutávku.

Resetovat

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