Implementacja serwera sieci Web HTTP. sys w ASP.NET CoreHTTP.sys web server implementation in ASP.NET Core

Autorzy Dykstra i Krzysztof RossBy Tom Dykstra and Chris Ross

Http. sys to serwer sieci Web dla ASP.NET Core , który działa tylko w systemie Windows.HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP. sys jest alternatywą dla Kestrel Server i oferuje pewne funkcje, które nie są Kestrel.HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

Ważne

Protokół HTTP. sys nie jest zgodny z modułem ASP.NET Core i nie można go używać z usługami IIS ani IIS Express.HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

W przypadku protokołu HTTP. sys obsługiwane są następujące funkcje:HTTP.sys supports the following features:

  • Uwierzytelnianie systemu WindowsWindows Authentication
  • Udostępnianie portówPort sharing
  • HTTPS z SNIHTTPS with SNI
  • HTTP/2 za pośrednictwem protokołu TLS (system Windows 10 lub nowszy)HTTP/2 over TLS (Windows 10 or later)
  • Bezpośrednia transmisja plikówDirect file transmission
  • Buforowanie odpowiedziResponse caching
  • Obiekty WebSockets (system Windows 8 lub nowszy)WebSockets (Windows 8 or later)

Obsługiwane wersje systemu Windows:Supported Windows versions:

  • System Windows 7 lub nowszyWindows 7 or later
  • Windows Server 2008 R2 lub nowszyWindows Server 2008 R2 or later

Wyświetl lub pobierz przykładowy kod (jak pobrać)View or download sample code (how to download)

Kiedy używać protokołu HTTP. sysWhen to use HTTP.sys

Metoda HTTP. sys jest przydatna w przypadku wdrożeń, w których:HTTP.sys is useful for deployments where:

  • Istnieje potrzeba bezpośredniego udostępnienia serwera w Internecie bez korzystania z usług IIS.There's a need to expose the server directly to the Internet without using IIS.

    Protokół HTTP. sys komunikuje się bezpośrednio z Internetem

  • Wdrożenie wewnętrzne wymaga, aby funkcja była niedostępna w Kestrel, taka jak uwierzytelnianie systemu Windows.An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    Protokół HTTP. sys komunikuje się bezpośrednio z siecią wewnętrzną

HTTP. sys jest doskonałym technologią chroniącą przed wieloma typami ataków i zapewnia niezawodność, bezpieczeństwo i skalowalność w pełni funkcjonalny serwer sieci Web.HTTP.sys is mature technology that protects against many types of attacks and provides the robustness, security, and scalability of a full-featured web server. Usługi IIS działają jako odbiornik HTTP na serwerze HTTP. sys.IIS itself runs as an HTTP listener on top of HTTP.sys.

Obsługa protokołu HTTP/2HTTP/2 support

Protokół HTTP/2 jest włączony dla aplikacji ASP.NET Core, jeśli spełnione są następujące wymagania podstawowe:HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

W przypadku nawiązania połączenia HTTP/2 raporty HttpRequest. Protocol HTTP/2 .If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/2.

Protokół HTTP/2 jest domyślnie włączony.HTTP/2 is enabled by default. Jeśli połączenie HTTP/2 nie zostało ustanowione, połączenie powraca do protokołu HTTP/1.1.If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. W przyszłych wydaniach systemu Windows są dostępne flagi konfiguracji protokołu HTTP/2, w tym możliwość wyłączenia protokołu HTTP/2 przy użyciu protokołu HTTP. sys.In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Uwierzytelnianie w trybie jądra przy użyciu protokołu KerberosKernel mode authentication with Kerberos

Serwer HTTP. sys deleguje do uwierzytelniania w trybie jądra przy użyciu protokołu uwierzytelniania Kerberos.HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Uwierzytelnianie w trybie użytkownika nie jest obsługiwane w przypadku protokołów Kerberos i HTTP. sys.User mode authentication isn't supported with Kerberos and HTTP.sys. Konto komputera musi służyć do odszyfrowywania tokenu lub biletu Kerberos uzyskanych z Active Directory i przesłanych przez klienta na serwer w celu uwierzytelnienia użytkownika.The machine account must be used to decrypt the Kerberos token/ticket that's obtained from Active Directory and forwarded by the client to the server to authenticate the user. Zarejestruj główną nazwę usługi (SPN) dla hosta, a nie użytkownika aplikacji.Register the Service Principal Name (SPN) for the host, not the user of the app.

Jak używać protokołu HTTP. sysHow to use HTTP.sys

Skonfiguruj aplikację ASP.NET Core do korzystania z protokołu HTTP. sysConfigure the ASP.NET Core app to use HTTP.sys

Wywołaj UseHttpSys metodę rozszerzającą podczas kompilowania hosta, określając wszystkie wymagane HttpSysOptions .Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. Poniższy przykład ustawia wartości domyślne dla opcji:The following example sets options to their default values:

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>();
        });

Dodatkowa konfiguracja protokołu HTTP. sys jest obsługiwana za pośrednictwem ustawień rejestru.Additional HTTP.sys configuration is handled through registry settings.

Opcje HTTP. sysHTTP.sys options

| WłaściwośćProperty | OpisDescription | DomyślneDefault | | --- title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

---- | ---title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:---- | --- title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

------ | :-----: | | AllowSynchronousIO | Określ, czy synchroniczne dane wejściowe/wyjściowe są dozwolone dla HttpContext.Request.Body i HttpContext.Response.Body .------ | :-----: | | AllowSynchronousIO | Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. | false| | Authentication. AllowAnonymous | Zezwalaj na żądania anonimowe. | false | | Authentication.AllowAnonymous | Allow anonymous requests. | true| | Uwierzytelnianie. schematy | Określ dozwolone schematy uwierzytelniania. | true | | Authentication.Schemes | Specify the allowed authentication schemes. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.May be modified at any time prior to disposing the listener. Wartości są dostarczane przez Wyliczenie AuthenticationSchemes: Basic ,, Kerberos , Negotiate None i NTLM .Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. | None| | EnableResponseCaching | Próba buforowania trybu jądra dla odpowiedzi z uprawnionymi nagłówkami. | None | | EnableResponseCaching | Attempt kernel-mode caching for responses with eligible headers. Odpowiedź nie może zawierać Set-Cookie nagłówków, Vary , ani Pragma .The response may not include Set-Cookie, Vary, or Pragma headers. Musi zawierać Cache-Control nagłówek, który jest, public a lub albo shared-max-age lub max-age Expires .It must include a Cache-Control header that's public and either a shared-max-age or max-age value, or an Expires header. | true| | MaxAccepts | Maksymalna liczba współbieżnych akceptacji. | true | | MaxAccepts | The maximum number of concurrent accepts. | 5 × środowisko.
ProcessorCount
| | MaxConnections | Maksymalna liczba jednoczesnych połączeń do zaakceptowania.
| 5 × Environment.
ProcessorCount
| | MaxConnections | The maximum number of concurrent connections to accept.
Użyj -1 do nieskończoności.Use -1 for infinite. Użyj null , aby użyć ustawienia dla całego komputera w rejestrze.Use null to use the registry's machine-wide setting. | null
(cały komputer(machine-wide
ustawienie) | | MaxRequestBodySize | Zobacz sekcję MaxRequestBodySize .setting) | | MaxRequestBodySize | See the MaxRequestBodySize section. | 30000000 bajtów| 30000000 bytes
(~ 28,6 MB) | | RequestQueueLimit | Maksymalna liczba żądań, które można umieścić w kolejce.(~28.6 MB) | | RequestQueueLimit | The maximum number of requests that can be queued. | 1000 | | RequestQueueMode | Wskazuje, czy serwer jest odpowiedzialny za tworzenie i Konfigurowanie kolejki żądań, czy też ma zostać dołączony do istniejącej kolejki.| 1000 | | RequestQueueMode | This indicates whether the server is responsible for creating and configuring the request queue, or if it should attach to an existing queue.
W przypadku dołączania do istniejącej kolejki nie mają zastosowania większość istniejących opcji konfiguracji.Most existing configuration options do not apply when attaching to an existing queue. | RequestQueueMode.Create| | RequestQueueName | Nazwa kolejki żądań HTTP. sys. | RequestQueueMode.Create | | RequestQueueName | The name of the HTTP.sys request queue. | null(Kolejka anonimowa) | | ThrowWriteExceptions | Wskaż, czy zapisy treści odpowiedzi nie powiodą się, ponieważ rozłączenia klienta nie powiedzie się, jeśli wyjątki lub są normalnie kompletne. | null (Anonymous queue) | | ThrowWriteExceptions | Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. | false
(pełna zwykła) | | Timeouts | Uwidocznić konfigurację HTTP. sys TimeoutManager , która może być również skonfigurowana w rejestrze.(complete normally) | | Timeouts | Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. Postępuj zgodnie z linkami interfejsu API, aby dowiedzieć się więcej na temat każdego ustawienia, w tym wartości domyślnych:Follow the API links to learn more about each setting, including default values:

| | | UrlPrefixes | Określ, UrlPrefixCollection Aby zarejestrować się w pliku http. sys.| | | UrlPrefixes | Specify the UrlPrefixCollection to register with HTTP.sys. Najbardziej przydatne jest UrlPrefixCollection. Add, który służy do dodawania prefiksu do kolekcji.The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.These may be modified at any time prior to disposing the listener. | || |

MaxRequestBodySizeMaxRequestBodySize

Maksymalny dozwolony rozmiar dowolnej treści żądania w bajtach.The maximum allowed size of any request body in bytes. W przypadku ustawienia wartości null Maksymalna wielkość treści żądania jest nieograniczona.When set to null, the maximum request body size is unlimited. Ten limit nie ma wpływu na uaktualnione połączenia, które są zawsze nieograniczone.This limit has no effect on upgraded connections, which are always unlimited.

Zalecaną metodą przesłonięcia limitu w aplikacji ASP.NET Core MVC dla pojedynczej IActionResult jest użycie RequestSizeLimitAttribute atrybutu dla metody akcji:The recommended method to override the limit in an ASP.NET Core MVC app for a single IActionResult is to use the RequestSizeLimitAttribute attribute on an action method:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Wyjątek jest zgłaszany, jeśli aplikacja próbuje skonfigurować limit żądania po rozpoczęciu odczytywania żądania przez aplikację.An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnlyWłaściwość może służyć do wskazywania MaxRequestBodySize , czy właściwość jest w stanie tylko do odczytu, co oznacza, że jest zbyt późno, aby skonfigurować limit.An IsReadOnly property can be used to indicate if the MaxRequestBodySize property is in a read-only state, meaning it's too late to configure the limit.

Jeśli aplikacja powinna przesłonić MaxRequestBodySize żądanie, użyj IHttpMaxRequestBodySizeFeature :If the app should override MaxRequestBodySize per-request, use the 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();
    });
}

Jeśli używasz programu Visual Studio, upewnij się, że aplikacja nie jest skonfigurowana do uruchamiania usług IIS ani IIS Express.If using Visual Studio, make sure the app isn't configured to run IIS or IIS Express.

W programie Visual Studio domyślny profil uruchamiania jest przeznaczony dla IIS Express.In Visual Studio, the default launch profile is for IIS Express. Aby uruchomić projekt jako aplikację konsolową, należy ręcznie zmienić wybrany profil, jak pokazano na poniższym zrzucie ekranu:To run the project as a console app, manually change the selected profile, as shown in the following screen shot:

Wybierz profil aplikacji konsoli

Konfigurowanie systemu Windows ServerConfigure Windows Server

  1. Określ porty do otwarcia dla aplikacji i Użyj zapory systemu Windows lub polecenia cmdlet New-NetFirewallRule programu PowerShell, aby otworzyć porty zapory w celu zezwolenia na ruch do pliku http. sys.Determine the ports to open for the app and use Windows Firewall or the New-NetFirewallRule PowerShell cmdlet to open firewall ports to allow traffic to reach HTTP.sys. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  2. Podczas wdrażania na maszynie wirtualnej platformy Azure Otwórz porty w sieciowej grupie zabezpieczeń.When deploying to an Azure VM, open the ports in the Network Security Group. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  3. Uzyskaj i zainstaluj certyfikaty X. 509, jeśli jest to wymagane.Obtain and install X.509 certificates, if required.

    W systemie Windows utwórz certyfikaty z podpisem własnym za pomocą polecenia cmdlet New-SelfSignedCertificate programu PowerShell.On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome. ps1.For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    Zainstaluj certyfikaty z podpisem własnym lub certyfikat podpisany przez urząd certyfikacji w magazynie Local Machine > osobistym komputera lokalnego na serwerze.Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. Jeśli aplikacja jest wdrożeniem zależnym od platformy, zainstaluj platformę .net core, .NET Framework lub obie (Jeśli aplikacja jest aplikacją platformy .NET Core przeznaczoną dla .NET Framework).If the app is a framework-dependent deployment, install .NET Core, .NET Framework, or both (if the app is a .NET Core app targeting the .NET Framework).

    Jeśli aplikacja jest wdrożeniemniezależnym, aplikacja zawiera środowisko uruchomieniowe w ramach wdrożenia.If the app is a self-contained deployment, the app includes the runtime in its deployment. Na serwerze nie jest wymagana instalacja platformy.No framework installation is required on the server.

  5. Skonfiguruj adresy URL i porty w aplikacji.Configure URLs and ports in the app.

    Domyślnie ASP.NET Core wiąże się z http://localhost:5000 .By default, ASP.NET Core binds to http://localhost:5000. Aby skonfigurować prefiksy i porty adresów URL, dostępne są następujące opcje:To configure URL prefixes and ports, options include:

    • UseUrls
    • urlsargument wiersza poleceniaurls command-line argument
    • ASPNETCORE_URLSZmienna środowiskowaASPNETCORE_URLS environment variable
    • UrlPrefixes

    Poniższy przykład kodu pokazuje, jak używać UrlPrefixes z lokalnym adresem IP serwera 10.0.0.4 na porcie 443:The following code example shows how to use UrlPrefixes with the server's local IP address 10.0.0.4 on port 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>();
            });
    

    Zaletą UrlPrefixes jest to, że komunikat o błędzie jest generowany natychmiast dla nieprawidłowo sformatowanych prefiksów.An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    Ustawienia w UrlPrefixes ustawieniach zastąpień UseUrls / urls / ASPNETCORE_URLS .The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. Z tego względu zaletą UseUrls , urls , i ASPNETCORE_URLS zmiennej środowiskowej jest łatwiejsze przełączanie między Kestrel i http. sys.Therefore, an advantage of UseUrls, urls, and the ASPNETCORE_URLS environment variable is that it's easier to switch between Kestrel and HTTP.sys.

    HTTP. sys używa formatów ciągu UrlPrefix interfejsu API serwera http.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    Ostrzeżenie

    http://*:80/ http://+:80 Nie należy używać powiązań z symbolami wieloznacznymi (i) najwyższego poziomu.Top-level wildcard bindings (http://*:80/ and http://+:80) should not be used. Powiązania z symbolami wieloznacznymi najwyższego poziomu tworzy luki w zabezpieczeniach aplikacji.Top-level wildcard bindings create app security vulnerabilities. Dotyczy to zarówno silnych, jak i słabych symboli wieloznacznych.This applies to both strong and weak wildcards. Używaj jawnych nazw hostów lub adresów IP, a nie symboli wieloznacznych.Use explicit host names or IP addresses rather than wildcards. Powiązanie symboli wieloznacznych w poddomenie (np *.mysub.com .) nie jest zagrożeniem bezpieczeństwa, jeśli kontrolujesz całą domenę nadrzędną (w przeciwieństwie do *.com , która jest narażona).Subdomain wildcard binding (for example, *.mysub.com) isn't a security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). Aby uzyskać więcej informacji, zobacz RFC 7230: sekcja 5,4: Host.For more information, see RFC 7230: Section 5.4: Host.

  6. Przedrejestruj prefiksy adresów URL na serwerze.Preregister URL prefixes on the server.

    Wbudowane narzędzie do konfigurowania protokołu HTTP. sys to netsh. exe.The built-in tool for configuring HTTP.sys is netsh.exe. netsh. exe służy do zastrzegania PREFIKSÓW adresów URL i przypisywania certyfikatów X. 509.netsh.exe is used to reserve URL prefixes and assign X.509 certificates. Narzędzie wymaga uprawnień administratora.The tool requires administrator privileges.

    Użyj narzędzia netsh. exe , aby zarejestrować adresy URL dla aplikacji:Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: W pełni kwalifikowany adres URL (Uniform Resource Locator).<URL>: The fully qualified Uniform Resource Locator (URL). Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowej nazwy hosta lub lokalnego adresu IP.Use a valid hostname or local IP address. Adres URL musi zawierać końcowy ukośnik.The URL must include a trailing slash.
    • <USER>: Określa nazwę użytkownika lub grupy użytkowników.<USER>: Specifies the user or user-group name.

    W poniższym przykładzie lokalny adres IP serwera 10.0.0.4 :In the following example, the local IP address of the server is 10.0.0.4:

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

    Po zarejestrowaniu adresu URL narzędzie reaguje na URL reservation successfully added .When a URL is registered, the tool responds with URL reservation successfully added.

    Aby usunąć zarejestrowany adres URL, użyj delete urlacl polecenia:To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. Zarejestruj certyfikaty X. 509 na serwerze.Register X.509 certificates on the server.

    Użyj narzędzia netsh. exe do rejestrowania certyfikatów dla aplikacji:Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Określa lokalny adres IP dla powiązania.<IP>: Specifies the local IP address for the binding. Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowego adresu IP.Use a valid IP address.
    • <PORT>: Określa port dla powiązania.<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>: Odcisk palca certyfikatu X. 509.<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>: Generowany przez deweloper identyfikator GUID reprezentujący aplikację do celów informacyjnych.<GUID>: A developer-generated GUID to represent the app for informational purposes.

    W celach referencyjnych Zapisz identyfikator GUID w aplikacji jako tag pakietu:For reference purposes, store the GUID in the app as a package tag:

    • W programie Visual Studio:In Visual Studio:
      • Otwórz właściwości projektu aplikacji, klikając prawym przyciskiem myszy aplikację w Eksplorator rozwiązań i wybierając pozycję Właściwości.Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • Wybierz kartę pakiet .Select the Package tab.
      • Wprowadź identyfikator GUID, który został utworzony w polu Tagi .Enter the GUID that you created in the Tags field.
    • Gdy nie korzystasz z programu Visual Studio:When not using Visual Studio:
      • Otwórz plik projektu aplikacji.Open the app's project file.

      • Dodaj <PackageTags> Właściwość do nowej lub istniejącej <PropertyGroup> przy użyciu identyfikatora GUID, który został utworzony:Add a <PackageTags> property to a new or existing <PropertyGroup> with the GUID that you created:

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

    W poniższym przykładzie:In the following example:

    • Lokalny adres IP serwera to 10.0.0.4 .The local IP address of the server is 10.0.0.4.
    • W trybie Online Generator losowy identyfikator GUID zawiera appid wartość.An online random GUID generator provides the appid value.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Po zarejestrowaniu certyfikatu narzędzie reaguje na SSL Certificate successfully added .When a certificate is registered, the tool responds with SSL Certificate successfully added.

    Aby usunąć rejestrację certyfikatu, użyj delete sslcert polecenia:To delete a certificate registration, use the delete sslcert command:

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

    Dokumentacja referencyjna dla programu netsh. exe:Reference documentation for netsh.exe:

  8. Uruchom aplikację.Run the app.

    Uprawnienia administratora nie są wymagane do uruchomienia aplikacji w przypadku powiązania z hostem localhost przy użyciu protokołu HTTP (nie HTTPS) z numerem portu większym niż 1024.Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. W przypadku innych konfiguracji (na przykład przy użyciu lokalnego adresu IP lub powiązania z portem 443) Uruchom aplikację z uprawnieniami administratora.For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    Aplikacja odpowiada na publiczny adres IP serwera.The app responds at the server's public IP address. W tym przykładzie serwer jest osiągalny z Internetu przy użyciu publicznego adresu IP 104.214.79.47 .In this example, the server is reached from the Internet at its public IP address of 104.214.79.47.

    W tym przykładzie jest używany certyfikat programistyczny.A development certificate is used in this example. Strona ładuje się bezpiecznie po pominięciu ostrzeżenia niezaufanego certyfikatu w przeglądarce.The page loads securely after bypassing the browser's untrusted certificate warning.

    Okno przeglądarki pokazujące załadowana stronę indeksu aplikacji

Scenariusze serwera proxy i modułu równoważenia obciążeniaProxy server and load balancer scenarios

W przypadku aplikacji hostowanych przez protokół HTTP. sys, które współdziałają z żądaniami z Internetu lub sieci firmowej, może być wymagana dodatkowa konfiguracja w przypadku hostowania za serwerami proxy i modułami równoważenia obciążenia.For apps hosted by HTTP.sys that interact with requests from the Internet or a corporate network, additional configuration might be required when hosting behind proxy servers and load balancers. Aby uzyskać więcej informacji, zobacz konfigurowanie ASP.NET Core do pracy z serwerami proxy i usługami równoważenia obciążenia.For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

Zasoby dodatkoweAdditional resources

Http. sys to serwer sieci Web dla ASP.NET Core , który działa tylko w systemie Windows.HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP. sys jest alternatywą dla Kestrel Server i oferuje pewne funkcje, które nie są Kestrel.HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

Ważne

Protokół HTTP. sys nie jest zgodny z modułem ASP.NET Core i nie można go używać z usługami IIS ani IIS Express.HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

W przypadku protokołu HTTP. sys obsługiwane są następujące funkcje:HTTP.sys supports the following features:

  • Uwierzytelnianie systemu WindowsWindows Authentication
  • Udostępnianie portówPort sharing
  • HTTPS z SNIHTTPS with SNI
  • HTTP/2 za pośrednictwem protokołu TLS (system Windows 10 lub nowszy)HTTP/2 over TLS (Windows 10 or later)
  • Bezpośrednia transmisja plikówDirect file transmission
  • Buforowanie odpowiedziResponse caching
  • Obiekty WebSockets (system Windows 8 lub nowszy)WebSockets (Windows 8 or later)

Obsługiwane wersje systemu Windows:Supported Windows versions:

  • System Windows 7 lub nowszyWindows 7 or later
  • Windows Server 2008 R2 lub nowszyWindows Server 2008 R2 or later

Wyświetl lub pobierz przykładowy kod (jak pobrać)View or download sample code (how to download)

Kiedy używać protokołu HTTP. sysWhen to use HTTP.sys

Metoda HTTP. sys jest przydatna w przypadku wdrożeń, w których:HTTP.sys is useful for deployments where:

  • Istnieje potrzeba bezpośredniego udostępnienia serwera w Internecie bez korzystania z usług IIS.There's a need to expose the server directly to the Internet without using IIS.

    Protokół HTTP. sys komunikuje się bezpośrednio z Internetem

  • Wdrożenie wewnętrzne wymaga, aby funkcja była niedostępna w Kestrel, taka jak uwierzytelnianie systemu Windows.An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    Protokół HTTP. sys komunikuje się bezpośrednio z siecią wewnętrzną

HTTP. sys jest doskonałym technologią chroniącą przed wieloma typami ataków i zapewnia niezawodność, bezpieczeństwo i skalowalność w pełni funkcjonalny serwer sieci Web.HTTP.sys is mature technology that protects against many types of attacks and provides the robustness, security, and scalability of a full-featured web server. Usługi IIS działają jako odbiornik HTTP na serwerze HTTP. sys.IIS itself runs as an HTTP listener on top of HTTP.sys.

Obsługa protokołu HTTP/2HTTP/2 support

Protokół HTTP/2 jest włączony dla aplikacji ASP.NET Core, jeśli spełnione są następujące wymagania podstawowe:HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

W przypadku nawiązania połączenia HTTP/2 raporty HttpRequest. Protocol HTTP/2 .If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/2.

Protokół HTTP/2 jest domyślnie włączony.HTTP/2 is enabled by default. Jeśli połączenie HTTP/2 nie zostało ustanowione, połączenie powraca do protokołu HTTP/1.1.If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. W przyszłych wydaniach systemu Windows są dostępne flagi konfiguracji protokołu HTTP/2, w tym możliwość wyłączenia protokołu HTTP/2 przy użyciu protokołu HTTP. sys.In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Uwierzytelnianie w trybie jądra przy użyciu protokołu KerberosKernel mode authentication with Kerberos

Serwer HTTP. sys deleguje do uwierzytelniania w trybie jądra przy użyciu protokołu uwierzytelniania Kerberos.HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Uwierzytelnianie w trybie użytkownika nie jest obsługiwane w przypadku protokołów Kerberos i HTTP. sys.User mode authentication isn't supported with Kerberos and HTTP.sys. Konto komputera musi służyć do odszyfrowywania tokenu lub biletu Kerberos uzyskanych z Active Directory i przesłanych przez klienta na serwer w celu uwierzytelnienia użytkownika.The machine account must be used to decrypt the Kerberos token/ticket that's obtained from Active Directory and forwarded by the client to the server to authenticate the user. Zarejestruj główną nazwę usługi (SPN) dla hosta, a nie użytkownika aplikacji.Register the Service Principal Name (SPN) for the host, not the user of the app.

Jak używać protokołu HTTP. sysHow to use HTTP.sys

Skonfiguruj aplikację ASP.NET Core do korzystania z protokołu HTTP. sysConfigure the ASP.NET Core app to use HTTP.sys

Wywołaj UseHttpSys metodę rozszerzającą podczas kompilowania hosta, określając wszystkie wymagane HttpSysOptions .Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. Poniższy przykład ustawia wartości domyślne dla opcji:The following example sets options to their default values:

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>();
        });

Dodatkowa konfiguracja protokołu HTTP. sys jest obsługiwana za pośrednictwem ustawień rejestru.Additional HTTP.sys configuration is handled through registry settings.

Opcje HTTP. sysHTTP.sys options

| WłaściwośćProperty | OpisDescription | DomyślneDefault | | --- title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

---- | ---title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:---- | --- title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

------ | :-----: | | AllowSynchronousIO | Określ, czy synchroniczne dane wejściowe/wyjściowe są dozwolone dla HttpContext.Request.Body i HttpContext.Response.Body .------ | :-----: | | AllowSynchronousIO | Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. | false| | Authentication. AllowAnonymous | Zezwalaj na żądania anonimowe. | false | | Authentication.AllowAnonymous | Allow anonymous requests. | true| | Uwierzytelnianie. schematy | Określ dozwolone schematy uwierzytelniania. | true | | Authentication.Schemes | Specify the allowed authentication schemes. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.May be modified at any time prior to disposing the listener. Wartości są dostarczane przez Wyliczenie AuthenticationSchemes: Basic ,, Kerberos , Negotiate None i NTLM .Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. | None| | EnableResponseCaching | Próba buforowania trybu jądra dla odpowiedzi z uprawnionymi nagłówkami. | None | | EnableResponseCaching | Attempt kernel-mode caching for responses with eligible headers. Odpowiedź nie może zawierać Set-Cookie nagłówków, Vary , ani Pragma .The response may not include Set-Cookie, Vary, or Pragma headers. Musi zawierać Cache-Control nagłówek, który jest, public a lub albo shared-max-age lub max-age Expires .It must include a Cache-Control header that's public and either a shared-max-age or max-age value, or an Expires header. | true| | MaxAccepts | Maksymalna liczba współbieżnych akceptacji. | true | | MaxAccepts | The maximum number of concurrent accepts. | 5 × środowisko.
ProcessorCount
| | MaxConnections | Maksymalna liczba jednoczesnych połączeń do zaakceptowania.
| 5 × Environment.
ProcessorCount
| | MaxConnections | The maximum number of concurrent connections to accept.
Użyj -1 do nieskończoności.Use -1 for infinite. Użyj null , aby użyć ustawienia dla całego komputera w rejestrze.Use null to use the registry's machine-wide setting. | null
(cały komputer(machine-wide
ustawienie) | | MaxRequestBodySize | Zobacz sekcję MaxRequestBodySize .setting) | | MaxRequestBodySize | See the MaxRequestBodySize section. | 30000000 bajtów| 30000000 bytes
(~ 28,6 MB) | | RequestQueueLimit | Maksymalna liczba żądań, które można umieścić w kolejce.(~28.6 MB) | | RequestQueueLimit | The maximum number of requests that can be queued. | 1000 | | ThrowWriteExceptions | Wskaż, czy zapisy treści odpowiedzi nie powiodą się, ponieważ rozłączenia klienta nie powiedzie się, jeśli wyjątki lub są normalnie kompletne.| 1000 | | ThrowWriteExceptions | Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. | false
(pełna zwykła) | | Timeouts | Uwidocznić konfigurację HTTP. sys TimeoutManager , która może być również skonfigurowana w rejestrze.(complete normally) | | Timeouts | Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. Postępuj zgodnie z linkami interfejsu API, aby dowiedzieć się więcej na temat każdego ustawienia, w tym wartości domyślnych:Follow the API links to learn more about each setting, including default values:

| | | UrlPrefixes | Określ, UrlPrefixCollection Aby zarejestrować się w pliku http. sys.| | | UrlPrefixes | Specify the UrlPrefixCollection to register with HTTP.sys. Najbardziej przydatne jest UrlPrefixCollection. Add, który służy do dodawania prefiksu do kolekcji.The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.These may be modified at any time prior to disposing the listener. | || |

MaxRequestBodySizeMaxRequestBodySize

Maksymalny dozwolony rozmiar dowolnej treści żądania w bajtach.The maximum allowed size of any request body in bytes. W przypadku ustawienia wartości null Maksymalna wielkość treści żądania jest nieograniczona.When set to null, the maximum request body size is unlimited. Ten limit nie ma wpływu na uaktualnione połączenia, które są zawsze nieograniczone.This limit has no effect on upgraded connections, which are always unlimited.

Zalecaną metodą przesłonięcia limitu w aplikacji ASP.NET Core MVC dla pojedynczej IActionResult jest użycie RequestSizeLimitAttribute atrybutu dla metody akcji:The recommended method to override the limit in an ASP.NET Core MVC app for a single IActionResult is to use the RequestSizeLimitAttribute attribute on an action method:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Wyjątek jest zgłaszany, jeśli aplikacja próbuje skonfigurować limit żądania po rozpoczęciu odczytywania żądania przez aplikację.An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnlyWłaściwość może służyć do wskazywania MaxRequestBodySize , czy właściwość jest w stanie tylko do odczytu, co oznacza, że jest zbyt późno, aby skonfigurować limit.An IsReadOnly property can be used to indicate if the MaxRequestBodySize property is in a read-only state, meaning it's too late to configure the limit.

Jeśli aplikacja powinna przesłonić MaxRequestBodySize żądanie, użyj IHttpMaxRequestBodySizeFeature :If the app should override MaxRequestBodySize per-request, use the 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();
    });
}

Jeśli używasz programu Visual Studio, upewnij się, że aplikacja nie jest skonfigurowana do uruchamiania usług IIS ani IIS Express.If using Visual Studio, make sure the app isn't configured to run IIS or IIS Express.

W programie Visual Studio domyślny profil uruchamiania jest przeznaczony dla IIS Express.In Visual Studio, the default launch profile is for IIS Express. Aby uruchomić projekt jako aplikację konsolową, należy ręcznie zmienić wybrany profil, jak pokazano na poniższym zrzucie ekranu:To run the project as a console app, manually change the selected profile, as shown in the following screen shot:

Wybierz profil aplikacji konsoli

Konfigurowanie systemu Windows ServerConfigure Windows Server

  1. Określ porty do otwarcia dla aplikacji i Użyj zapory systemu Windows lub polecenia cmdlet New-NetFirewallRule programu PowerShell, aby otworzyć porty zapory w celu zezwolenia na ruch do pliku http. sys.Determine the ports to open for the app and use Windows Firewall or the New-NetFirewallRule PowerShell cmdlet to open firewall ports to allow traffic to reach HTTP.sys. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  2. Podczas wdrażania na maszynie wirtualnej platformy Azure Otwórz porty w sieciowej grupie zabezpieczeń.When deploying to an Azure VM, open the ports in the Network Security Group. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  3. Uzyskaj i zainstaluj certyfikaty X. 509, jeśli jest to wymagane.Obtain and install X.509 certificates, if required.

    W systemie Windows utwórz certyfikaty z podpisem własnym za pomocą polecenia cmdlet New-SelfSignedCertificate programu PowerShell.On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome. ps1.For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    Zainstaluj certyfikaty z podpisem własnym lub certyfikat podpisany przez urząd certyfikacji w magazynie Local Machine > osobistym komputera lokalnego na serwerze.Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. Jeśli aplikacja jest wdrożeniem zależnym od platformy, zainstaluj platformę .net core, .NET Framework lub obie (Jeśli aplikacja jest aplikacją platformy .NET Core przeznaczoną dla .NET Framework).If the app is a framework-dependent deployment, install .NET Core, .NET Framework, or both (if the app is a .NET Core app targeting the .NET Framework).

    Jeśli aplikacja jest wdrożeniemniezależnym, aplikacja zawiera środowisko uruchomieniowe w ramach wdrożenia.If the app is a self-contained deployment, the app includes the runtime in its deployment. Na serwerze nie jest wymagana instalacja platformy.No framework installation is required on the server.

  5. Skonfiguruj adresy URL i porty w aplikacji.Configure URLs and ports in the app.

    Domyślnie ASP.NET Core wiąże się z http://localhost:5000 .By default, ASP.NET Core binds to http://localhost:5000. Aby skonfigurować prefiksy i porty adresów URL, dostępne są następujące opcje:To configure URL prefixes and ports, options include:

    • UseUrls
    • urlsargument wiersza poleceniaurls command-line argument
    • ASPNETCORE_URLSZmienna środowiskowaASPNETCORE_URLS environment variable
    • UrlPrefixes

    Poniższy przykład kodu pokazuje, jak używać UrlPrefixes z lokalnym adresem IP serwera 10.0.0.4 na porcie 443:The following code example shows how to use UrlPrefixes with the server's local IP address 10.0.0.4 on port 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>();
            });
    

    Zaletą UrlPrefixes jest to, że komunikat o błędzie jest generowany natychmiast dla nieprawidłowo sformatowanych prefiksów.An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    Ustawienia w UrlPrefixes ustawieniach zastąpień UseUrls / urls / ASPNETCORE_URLS .The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. Z tego względu zaletą UseUrls , urls , i ASPNETCORE_URLS zmiennej środowiskowej jest łatwiejsze przełączanie między Kestrel i http. sys.Therefore, an advantage of UseUrls, urls, and the ASPNETCORE_URLS environment variable is that it's easier to switch between Kestrel and HTTP.sys.

    HTTP. sys używa formatów ciągu UrlPrefix interfejsu API serwera http.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    Ostrzeżenie

    http://*:80/ http://+:80 Nie należy używać powiązań z symbolami wieloznacznymi (i) najwyższego poziomu.Top-level wildcard bindings (http://*:80/ and http://+:80) should not be used. Powiązania z symbolami wieloznacznymi najwyższego poziomu tworzy luki w zabezpieczeniach aplikacji.Top-level wildcard bindings create app security vulnerabilities. Dotyczy to zarówno silnych, jak i słabych symboli wieloznacznych.This applies to both strong and weak wildcards. Używaj jawnych nazw hostów lub adresów IP, a nie symboli wieloznacznych.Use explicit host names or IP addresses rather than wildcards. Powiązanie symboli wieloznacznych w poddomenie (np *.mysub.com .) nie jest zagrożeniem bezpieczeństwa, jeśli kontrolujesz całą domenę nadrzędną (w przeciwieństwie do *.com , która jest narażona).Subdomain wildcard binding (for example, *.mysub.com) isn't a security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). Aby uzyskać więcej informacji, zobacz RFC 7230: sekcja 5,4: Host.For more information, see RFC 7230: Section 5.4: Host.

  6. Przedrejestruj prefiksy adresów URL na serwerze.Preregister URL prefixes on the server.

    Wbudowane narzędzie do konfigurowania protokołu HTTP. sys to netsh. exe.The built-in tool for configuring HTTP.sys is netsh.exe. netsh. exe służy do zastrzegania PREFIKSÓW adresów URL i przypisywania certyfikatów X. 509.netsh.exe is used to reserve URL prefixes and assign X.509 certificates. Narzędzie wymaga uprawnień administratora.The tool requires administrator privileges.

    Użyj narzędzia netsh. exe , aby zarejestrować adresy URL dla aplikacji:Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: W pełni kwalifikowany adres URL (Uniform Resource Locator).<URL>: The fully qualified Uniform Resource Locator (URL). Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowej nazwy hosta lub lokalnego adresu IP.Use a valid hostname or local IP address. Adres URL musi zawierać końcowy ukośnik.The URL must include a trailing slash.
    • <USER>: Określa nazwę użytkownika lub grupy użytkowników.<USER>: Specifies the user or user-group name.

    W poniższym przykładzie lokalny adres IP serwera 10.0.0.4 :In the following example, the local IP address of the server is 10.0.0.4:

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

    Po zarejestrowaniu adresu URL narzędzie reaguje na URL reservation successfully added .When a URL is registered, the tool responds with URL reservation successfully added.

    Aby usunąć zarejestrowany adres URL, użyj delete urlacl polecenia:To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. Zarejestruj certyfikaty X. 509 na serwerze.Register X.509 certificates on the server.

    Użyj narzędzia netsh. exe do rejestrowania certyfikatów dla aplikacji:Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Określa lokalny adres IP dla powiązania.<IP>: Specifies the local IP address for the binding. Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowego adresu IP.Use a valid IP address.
    • <PORT>: Określa port dla powiązania.<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>: Odcisk palca certyfikatu X. 509.<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>: Generowany przez deweloper identyfikator GUID reprezentujący aplikację do celów informacyjnych.<GUID>: A developer-generated GUID to represent the app for informational purposes.

    W celach referencyjnych Zapisz identyfikator GUID w aplikacji jako tag pakietu:For reference purposes, store the GUID in the app as a package tag:

    • W programie Visual Studio:In Visual Studio:
      • Otwórz właściwości projektu aplikacji, klikając prawym przyciskiem myszy aplikację w Eksplorator rozwiązań i wybierając pozycję Właściwości.Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • Wybierz kartę pakiet .Select the Package tab.
      • Wprowadź identyfikator GUID, który został utworzony w polu Tagi .Enter the GUID that you created in the Tags field.
    • Gdy nie korzystasz z programu Visual Studio:When not using Visual Studio:
      • Otwórz plik projektu aplikacji.Open the app's project file.

      • Dodaj <PackageTags> Właściwość do nowej lub istniejącej <PropertyGroup> przy użyciu identyfikatora GUID, który został utworzony:Add a <PackageTags> property to a new or existing <PropertyGroup> with the GUID that you created:

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

    W poniższym przykładzie:In the following example:

    • Lokalny adres IP serwera to 10.0.0.4 .The local IP address of the server is 10.0.0.4.
    • W trybie Online Generator losowy identyfikator GUID zawiera appid wartość.An online random GUID generator provides the appid value.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Po zarejestrowaniu certyfikatu narzędzie reaguje na SSL Certificate successfully added .When a certificate is registered, the tool responds with SSL Certificate successfully added.

    Aby usunąć rejestrację certyfikatu, użyj delete sslcert polecenia:To delete a certificate registration, use the delete sslcert command:

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

    Dokumentacja referencyjna dla programu netsh. exe:Reference documentation for netsh.exe:

  8. Uruchom aplikację.Run the app.

    Uprawnienia administratora nie są wymagane do uruchomienia aplikacji w przypadku powiązania z hostem localhost przy użyciu protokołu HTTP (nie HTTPS) z numerem portu większym niż 1024.Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. W przypadku innych konfiguracji (na przykład przy użyciu lokalnego adresu IP lub powiązania z portem 443) Uruchom aplikację z uprawnieniami administratora.For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    Aplikacja odpowiada na publiczny adres IP serwera.The app responds at the server's public IP address. W tym przykładzie serwer jest osiągalny z Internetu przy użyciu publicznego adresu IP 104.214.79.47 .In this example, the server is reached from the Internet at its public IP address of 104.214.79.47.

    W tym przykładzie jest używany certyfikat programistyczny.A development certificate is used in this example. Strona ładuje się bezpiecznie po pominięciu ostrzeżenia niezaufanego certyfikatu w przeglądarce.The page loads securely after bypassing the browser's untrusted certificate warning.

    Okno przeglądarki pokazujące załadowana stronę indeksu aplikacji

Scenariusze serwera proxy i modułu równoważenia obciążeniaProxy server and load balancer scenarios

W przypadku aplikacji hostowanych przez protokół HTTP. sys, które współdziałają z żądaniami z Internetu lub sieci firmowej, może być wymagana dodatkowa konfiguracja w przypadku hostowania za serwerami proxy i modułami równoważenia obciążenia.For apps hosted by HTTP.sys that interact with requests from the Internet or a corporate network, additional configuration might be required when hosting behind proxy servers and load balancers. Aby uzyskać więcej informacji, zobacz konfigurowanie ASP.NET Core do pracy z serwerami proxy i usługami równoważenia obciążenia.For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

Zasoby dodatkoweAdditional resources

Http. sys to serwer sieci Web dla ASP.NET Core , który działa tylko w systemie Windows.HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP. sys jest alternatywą dla Kestrel Server i oferuje pewne funkcje, które nie są Kestrel.HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

Ważne

Protokół HTTP. sys nie jest zgodny z modułem ASP.NET Core i nie można go używać z usługami IIS ani IIS Express.HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

W przypadku protokołu HTTP. sys obsługiwane są następujące funkcje:HTTP.sys supports the following features:

  • Uwierzytelnianie systemu WindowsWindows Authentication
  • Udostępnianie portówPort sharing
  • HTTPS z SNIHTTPS with SNI
  • HTTP/2 za pośrednictwem protokołu TLS (system Windows 10 lub nowszy)HTTP/2 over TLS (Windows 10 or later)
  • Bezpośrednia transmisja plikówDirect file transmission
  • Buforowanie odpowiedziResponse caching
  • Obiekty WebSockets (system Windows 8 lub nowszy)WebSockets (Windows 8 or later)

Obsługiwane wersje systemu Windows:Supported Windows versions:

  • System Windows 7 lub nowszyWindows 7 or later
  • Windows Server 2008 R2 lub nowszyWindows Server 2008 R2 or later

Wyświetl lub pobierz przykładowy kod (jak pobrać)View or download sample code (how to download)

Kiedy używać protokołu HTTP. sysWhen to use HTTP.sys

Metoda HTTP. sys jest przydatna w przypadku wdrożeń, w których:HTTP.sys is useful for deployments where:

  • Istnieje potrzeba bezpośredniego udostępnienia serwera w Internecie bez korzystania z usług IIS.There's a need to expose the server directly to the Internet without using IIS.

    Protokół HTTP. sys komunikuje się bezpośrednio z Internetem

  • Wdrożenie wewnętrzne wymaga, aby funkcja była niedostępna w Kestrel, taka jak uwierzytelnianie systemu Windows.An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    Protokół HTTP. sys komunikuje się bezpośrednio z siecią wewnętrzną

HTTP. sys jest doskonałym technologią chroniącą przed wieloma typami ataków i zapewnia niezawodność, bezpieczeństwo i skalowalność w pełni funkcjonalny serwer sieci Web.HTTP.sys is mature technology that protects against many types of attacks and provides the robustness, security, and scalability of a full-featured web server. Usługi IIS działają jako odbiornik HTTP na serwerze HTTP. sys.IIS itself runs as an HTTP listener on top of HTTP.sys.

Obsługa protokołu HTTP/2HTTP/2 support

Protokół HTTP/2 jest włączony dla aplikacji ASP.NET Core, jeśli spełnione są następujące wymagania podstawowe:HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

W przypadku nawiązania połączenia HTTP/2 raporty HttpRequest. Protocol HTTP/2 .If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/2.

Protokół HTTP/2 jest domyślnie włączony.HTTP/2 is enabled by default. Jeśli połączenie HTTP/2 nie zostało ustanowione, połączenie powraca do protokołu HTTP/1.1.If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. W przyszłych wydaniach systemu Windows są dostępne flagi konfiguracji protokołu HTTP/2, w tym możliwość wyłączenia protokołu HTTP/2 przy użyciu protokołu HTTP. sys.In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Uwierzytelnianie w trybie jądra przy użyciu protokołu KerberosKernel mode authentication with Kerberos

Serwer HTTP. sys deleguje do uwierzytelniania w trybie jądra przy użyciu protokołu uwierzytelniania Kerberos.HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Uwierzytelnianie w trybie użytkownika nie jest obsługiwane w przypadku protokołów Kerberos i HTTP. sys.User mode authentication isn't supported with Kerberos and HTTP.sys. Konto komputera musi służyć do odszyfrowywania tokenu lub biletu Kerberos uzyskanych z Active Directory i przesłanych przez klienta na serwer w celu uwierzytelnienia użytkownika.The machine account must be used to decrypt the Kerberos token/ticket that's obtained from Active Directory and forwarded by the client to the server to authenticate the user. Zarejestruj główną nazwę usługi (SPN) dla hosta, a nie użytkownika aplikacji.Register the Service Principal Name (SPN) for the host, not the user of the app.

Jak używać protokołu HTTP. sysHow to use HTTP.sys

Skonfiguruj aplikację ASP.NET Core do korzystania z protokołu HTTP. sysConfigure the ASP.NET Core app to use HTTP.sys

Odwołanie do pakietu w pliku projektu nie jest wymagane w przypadku korzystania z pakietu Microsoft. AspNetCore. appbinding (NuGet.org).A package reference in the project file isn't required when using the Microsoft.AspNetCore.App metapackage (nuget.org). Gdy nie korzystasz z Microsoft.AspNetCore.App pakietu, Dodaj odwołanie do pakietu do Microsoft. AspNetCore. Server. HttpSys.When not using the Microsoft.AspNetCore.App metapackage, add a package reference to Microsoft.AspNetCore.Server.HttpSys.

Wywołaj UseHttpSys metodę rozszerzającą podczas kompilowania hosta, określając wszystkie wymagane HttpSysOptions .Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. Poniższy przykład ustawia wartości domyślne dla opcji:The following example sets options to their default values:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseHttpSys(options =>
        {
            options.AllowSynchronousIO = true;
            options.Authentication.Schemes = AuthenticationSchemes.None;
            options.Authentication.AllowAnonymous = true;
            options.MaxConnections = null;
            options.MaxRequestBodySize = 30000000;
            options.UrlPrefixes.Add("http://localhost:5000");
        });

Dodatkowa konfiguracja protokołu HTTP. sys jest obsługiwana za pośrednictwem ustawień rejestru.Additional HTTP.sys configuration is handled through registry settings.

Opcje HTTP. sysHTTP.sys options

| WłaściwośćProperty | OpisDescription | DomyślneDefault | | --- title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

---- | ---title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:---- | --- title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

------ | :-----: | | AllowSynchronousIO | Określ, czy synchroniczne dane wejściowe/wyjściowe są dozwolone dla HttpContext.Request.Body i HttpContext.Response.Body .------ | :-----: | | AllowSynchronousIO | Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. | true| | Authentication. AllowAnonymous | Zezwalaj na żądania anonimowe. | true | | Authentication.AllowAnonymous | Allow anonymous requests. | true| | Uwierzytelnianie. schematy | Określ dozwolone schematy uwierzytelniania. | true | | Authentication.Schemes | Specify the allowed authentication schemes. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.May be modified at any time prior to disposing the listener. Wartości są dostarczane przez Wyliczenie AuthenticationSchemes: Basic ,, Kerberos , Negotiate None i NTLM .Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. | None| | EnableResponseCaching | Próba buforowania trybu jądra dla odpowiedzi z uprawnionymi nagłówkami. | None | | EnableResponseCaching | Attempt kernel-mode caching for responses with eligible headers. Odpowiedź nie może zawierać Set-Cookie nagłówków, Vary , ani Pragma .The response may not include Set-Cookie, Vary, or Pragma headers. Musi zawierać Cache-Control nagłówek, który jest, public a lub albo shared-max-age lub max-age Expires .It must include a Cache-Control header that's public and either a shared-max-age or max-age value, or an Expires header. | true| | MaxAccepts | Maksymalna liczba współbieżnych akceptacji. | true | | MaxAccepts | The maximum number of concurrent accepts. | 5 × środowisko.
ProcessorCount
| | MaxConnections | Maksymalna liczba jednoczesnych połączeń do zaakceptowania.
| 5 × Environment.
ProcessorCount
| | MaxConnections | The maximum number of concurrent connections to accept.
Użyj -1 do nieskończoności.Use -1 for infinite. Użyj null , aby użyć ustawienia dla całego komputera w rejestrze.Use null to use the registry's machine-wide setting. | null
(cały komputer(machine-wide
ustawienie) | | MaxRequestBodySize | Zobacz sekcję MaxRequestBodySize .setting) | | MaxRequestBodySize | See the MaxRequestBodySize section. | 30000000 bajtów| 30000000 bytes
(~ 28,6 MB) | | RequestQueueLimit | Maksymalna liczba żądań, które można umieścić w kolejce.(~28.6 MB) | | RequestQueueLimit | The maximum number of requests that can be queued. | 1000 | | ThrowWriteExceptions | Wskaż, czy zapisy treści odpowiedzi nie powiodą się, ponieważ rozłączenia klienta nie powiedzie się, jeśli wyjątki lub są normalnie kompletne.| 1000 | | ThrowWriteExceptions | Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. | false
(pełna zwykła) | | Timeouts | Uwidocznić konfigurację HTTP. sys TimeoutManager , która może być również skonfigurowana w rejestrze.(complete normally) | | Timeouts | Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. Postępuj zgodnie z linkami interfejsu API, aby dowiedzieć się więcej na temat każdego ustawienia, w tym wartości domyślnych:Follow the API links to learn more about each setting, including default values:

| | | UrlPrefixes | Określ, UrlPrefixCollection Aby zarejestrować się w pliku http. sys.| | | UrlPrefixes | Specify the UrlPrefixCollection to register with HTTP.sys. Najbardziej przydatne jest UrlPrefixCollection. Add, który służy do dodawania prefiksu do kolekcji.The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.These may be modified at any time prior to disposing the listener. | || |

MaxRequestBodySizeMaxRequestBodySize

Maksymalny dozwolony rozmiar dowolnej treści żądania w bajtach.The maximum allowed size of any request body in bytes. W przypadku ustawienia wartości null Maksymalna wielkość treści żądania jest nieograniczona.When set to null, the maximum request body size is unlimited. Ten limit nie ma wpływu na uaktualnione połączenia, które są zawsze nieograniczone.This limit has no effect on upgraded connections, which are always unlimited.

Zalecaną metodą przesłonięcia limitu w aplikacji ASP.NET Core MVC dla pojedynczej IActionResult jest użycie RequestSizeLimitAttribute atrybutu dla metody akcji:The recommended method to override the limit in an ASP.NET Core MVC app for a single IActionResult is to use the RequestSizeLimitAttribute attribute on an action method:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Wyjątek jest zgłaszany, jeśli aplikacja próbuje skonfigurować limit żądania po rozpoczęciu odczytywania żądania przez aplikację.An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnlyWłaściwość może służyć do wskazywania MaxRequestBodySize , czy właściwość jest w stanie tylko do odczytu, co oznacza, że jest zbyt późno, aby skonfigurować limit.An IsReadOnly property can be used to indicate if the MaxRequestBodySize property is in a read-only state, meaning it's too late to configure the limit.

Jeśli aplikacja powinna przesłonić MaxRequestBodySize żądanie, użyj IHttpMaxRequestBodySizeFeature :If the app should override MaxRequestBodySize per-request, use the IHttpMaxRequestBodySizeFeature:

public void Configure(IApplicationBuilder app, IHostingEnvironment 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.UseHsts();
    }

    // Enable HTTPS Redirection Middleware when hosting the app securely.
    //app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseMvc();
}

Jeśli używasz programu Visual Studio, upewnij się, że aplikacja nie jest skonfigurowana do uruchamiania usług IIS ani IIS Express.If using Visual Studio, make sure the app isn't configured to run IIS or IIS Express.

W programie Visual Studio domyślny profil uruchamiania jest przeznaczony dla IIS Express.In Visual Studio, the default launch profile is for IIS Express. Aby uruchomić projekt jako aplikację konsolową, należy ręcznie zmienić wybrany profil, jak pokazano na poniższym zrzucie ekranu:To run the project as a console app, manually change the selected profile, as shown in the following screen shot:

Wybierz profil aplikacji konsoli

Konfigurowanie systemu Windows ServerConfigure Windows Server

  1. Określ porty do otwarcia dla aplikacji i Użyj zapory systemu Windows lub polecenia cmdlet New-NetFirewallRule programu PowerShell, aby otworzyć porty zapory w celu zezwolenia na ruch do pliku http. sys.Determine the ports to open for the app and use Windows Firewall or the New-NetFirewallRule PowerShell cmdlet to open firewall ports to allow traffic to reach HTTP.sys. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  2. Podczas wdrażania na maszynie wirtualnej platformy Azure Otwórz porty w sieciowej grupie zabezpieczeń.When deploying to an Azure VM, open the ports in the Network Security Group. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  3. Uzyskaj i zainstaluj certyfikaty X. 509, jeśli jest to wymagane.Obtain and install X.509 certificates, if required.

    W systemie Windows utwórz certyfikaty z podpisem własnym za pomocą polecenia cmdlet New-SelfSignedCertificate programu PowerShell.On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome. ps1.For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    Zainstaluj certyfikaty z podpisem własnym lub certyfikat podpisany przez urząd certyfikacji w magazynie Local Machine > osobistym komputera lokalnego na serwerze.Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. Jeśli aplikacja jest wdrożeniem zależnym od platformy, zainstaluj platformę .net core, .NET Framework lub obie (Jeśli aplikacja jest aplikacją platformy .NET Core przeznaczoną dla .NET Framework).If the app is a framework-dependent deployment, install .NET Core, .NET Framework, or both (if the app is a .NET Core app targeting the .NET Framework).

    Jeśli aplikacja jest wdrożeniemniezależnym, aplikacja zawiera środowisko uruchomieniowe w ramach wdrożenia.If the app is a self-contained deployment, the app includes the runtime in its deployment. Na serwerze nie jest wymagana instalacja platformy.No framework installation is required on the server.

  5. Skonfiguruj adresy URL i porty w aplikacji.Configure URLs and ports in the app.

    Domyślnie ASP.NET Core wiąże się z http://localhost:5000 .By default, ASP.NET Core binds to http://localhost:5000. Aby skonfigurować prefiksy i porty adresów URL, dostępne są następujące opcje:To configure URL prefixes and ports, options include:

    • UseUrls
    • urlsargument wiersza poleceniaurls command-line argument
    • ASPNETCORE_URLSZmienna środowiskowaASPNETCORE_URLS environment variable
    • UrlPrefixes

    Poniższy przykład kodu pokazuje, jak używać UrlPrefixes z lokalnym adresem IP serwera 10.0.0.4 na porcie 443:The following code example shows how to use UrlPrefixes with the server's local IP address 10.0.0.4 on port 443:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                options.UrlPrefixes.Add("https://10.0.0.4:443");
            });
    

    Zaletą UrlPrefixes jest to, że komunikat o błędzie jest generowany natychmiast dla nieprawidłowo sformatowanych prefiksów.An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    Ustawienia w UrlPrefixes ustawieniach zastąpień UseUrls / urls / ASPNETCORE_URLS .The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. Z tego względu zaletą UseUrls , urls , i ASPNETCORE_URLS zmiennej środowiskowej jest łatwiejsze przełączanie między Kestrel i http. sys.Therefore, an advantage of UseUrls, urls, and the ASPNETCORE_URLS environment variable is that it's easier to switch between Kestrel and HTTP.sys.

    HTTP. sys używa formatów ciągu UrlPrefix interfejsu API serwera http.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    Ostrzeżenie

    http://*:80/ http://+:80 Nie należy używać powiązań z symbolami wieloznacznymi (i) najwyższego poziomu.Top-level wildcard bindings (http://*:80/ and http://+:80) should not be used. Powiązania z symbolami wieloznacznymi najwyższego poziomu tworzy luki w zabezpieczeniach aplikacji.Top-level wildcard bindings create app security vulnerabilities. Dotyczy to zarówno silnych, jak i słabych symboli wieloznacznych.This applies to both strong and weak wildcards. Używaj jawnych nazw hostów lub adresów IP, a nie symboli wieloznacznych.Use explicit host names or IP addresses rather than wildcards. Powiązanie symboli wieloznacznych w poddomenie (np *.mysub.com .) nie jest zagrożeniem bezpieczeństwa, jeśli kontrolujesz całą domenę nadrzędną (w przeciwieństwie do *.com , która jest narażona).Subdomain wildcard binding (for example, *.mysub.com) isn't a security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). Aby uzyskać więcej informacji, zobacz RFC 7230: sekcja 5,4: Host.For more information, see RFC 7230: Section 5.4: Host.

  6. Przedrejestruj prefiksy adresów URL na serwerze.Preregister URL prefixes on the server.

    Wbudowane narzędzie do konfigurowania protokołu HTTP. sys to netsh. exe.The built-in tool for configuring HTTP.sys is netsh.exe. netsh. exe służy do zastrzegania PREFIKSÓW adresów URL i przypisywania certyfikatów X. 509.netsh.exe is used to reserve URL prefixes and assign X.509 certificates. Narzędzie wymaga uprawnień administratora.The tool requires administrator privileges.

    Użyj narzędzia netsh. exe , aby zarejestrować adresy URL dla aplikacji:Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: W pełni kwalifikowany adres URL (Uniform Resource Locator).<URL>: The fully qualified Uniform Resource Locator (URL). Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowej nazwy hosta lub lokalnego adresu IP.Use a valid hostname or local IP address. Adres URL musi zawierać końcowy ukośnik.The URL must include a trailing slash.
    • <USER>: Określa nazwę użytkownika lub grupy użytkowników.<USER>: Specifies the user or user-group name.

    W poniższym przykładzie lokalny adres IP serwera 10.0.0.4 :In the following example, the local IP address of the server is 10.0.0.4:

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

    Po zarejestrowaniu adresu URL narzędzie reaguje na URL reservation successfully added .When a URL is registered, the tool responds with URL reservation successfully added.

    Aby usunąć zarejestrowany adres URL, użyj delete urlacl polecenia:To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. Zarejestruj certyfikaty X. 509 na serwerze.Register X.509 certificates on the server.

    Użyj narzędzia netsh. exe do rejestrowania certyfikatów dla aplikacji:Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Określa lokalny adres IP dla powiązania.<IP>: Specifies the local IP address for the binding. Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowego adresu IP.Use a valid IP address.
    • <PORT>: Określa port dla powiązania.<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>: Odcisk palca certyfikatu X. 509.<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>: Generowany przez deweloper identyfikator GUID reprezentujący aplikację do celów informacyjnych.<GUID>: A developer-generated GUID to represent the app for informational purposes.

    W celach referencyjnych Zapisz identyfikator GUID w aplikacji jako tag pakietu:For reference purposes, store the GUID in the app as a package tag:

    • W programie Visual Studio:In Visual Studio:
      • Otwórz właściwości projektu aplikacji, klikając prawym przyciskiem myszy aplikację w Eksplorator rozwiązań i wybierając pozycję Właściwości.Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • Wybierz kartę pakiet .Select the Package tab.
      • Wprowadź identyfikator GUID, który został utworzony w polu Tagi .Enter the GUID that you created in the Tags field.
    • Gdy nie korzystasz z programu Visual Studio:When not using Visual Studio:
      • Otwórz plik projektu aplikacji.Open the app's project file.

      • Dodaj <PackageTags> Właściwość do nowej lub istniejącej <PropertyGroup> przy użyciu identyfikatora GUID, który został utworzony:Add a <PackageTags> property to a new or existing <PropertyGroup> with the GUID that you created:

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

    W poniższym przykładzie:In the following example:

    • Lokalny adres IP serwera to 10.0.0.4 .The local IP address of the server is 10.0.0.4.
    • W trybie Online Generator losowy identyfikator GUID zawiera appid wartość.An online random GUID generator provides the appid value.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Po zarejestrowaniu certyfikatu narzędzie reaguje na SSL Certificate successfully added .When a certificate is registered, the tool responds with SSL Certificate successfully added.

    Aby usunąć rejestrację certyfikatu, użyj delete sslcert polecenia:To delete a certificate registration, use the delete sslcert command:

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

    Dokumentacja referencyjna dla programu netsh. exe:Reference documentation for netsh.exe:

  8. Uruchom aplikację.Run the app.

    Uprawnienia administratora nie są wymagane do uruchomienia aplikacji w przypadku powiązania z hostem localhost przy użyciu protokołu HTTP (nie HTTPS) z numerem portu większym niż 1024.Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. W przypadku innych konfiguracji (na przykład przy użyciu lokalnego adresu IP lub powiązania z portem 443) Uruchom aplikację z uprawnieniami administratora.For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    Aplikacja odpowiada na publiczny adres IP serwera.The app responds at the server's public IP address. W tym przykładzie serwer jest osiągalny z Internetu przy użyciu publicznego adresu IP 104.214.79.47 .In this example, the server is reached from the Internet at its public IP address of 104.214.79.47.

    W tym przykładzie jest używany certyfikat programistyczny.A development certificate is used in this example. Strona ładuje się bezpiecznie po pominięciu ostrzeżenia niezaufanego certyfikatu w przeglądarce.The page loads securely after bypassing the browser's untrusted certificate warning.

    Okno przeglądarki pokazujące załadowana stronę indeksu aplikacji

Scenariusze serwera proxy i modułu równoważenia obciążeniaProxy server and load balancer scenarios

W przypadku aplikacji hostowanych przez protokół HTTP. sys, które współdziałają z żądaniami z Internetu lub sieci firmowej, może być wymagana dodatkowa konfiguracja w przypadku hostowania za serwerami proxy i modułami równoważenia obciążenia.For apps hosted by HTTP.sys that interact with requests from the Internet or a corporate network, additional configuration might be required when hosting behind proxy servers and load balancers. Aby uzyskać więcej informacji, zobacz konfigurowanie ASP.NET Core do pracy z serwerami proxy i usługami równoważenia obciążenia.For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

Zasoby dodatkoweAdditional resources

Http. sys to serwer sieci Web dla ASP.NET Core , który działa tylko w systemie Windows.HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP. sys jest alternatywą dla Kestrel Server i oferuje pewne funkcje, które nie są Kestrel.HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

Ważne

Protokół HTTP. sys nie jest zgodny z modułem ASP.NET Core i nie można go używać z usługami IIS ani IIS Express.HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

W przypadku protokołu HTTP. sys obsługiwane są następujące funkcje:HTTP.sys supports the following features:

  • Uwierzytelnianie systemu WindowsWindows Authentication
  • Udostępnianie portówPort sharing
  • HTTPS z SNIHTTPS with SNI
  • HTTP/2 za pośrednictwem protokołu TLS (system Windows 10 lub nowszy)HTTP/2 over TLS (Windows 10 or later)
  • Bezpośrednia transmisja plikówDirect file transmission
  • Buforowanie odpowiedziResponse caching
  • Obiekty WebSockets (system Windows 8 lub nowszy)WebSockets (Windows 8 or later)

Obsługiwane wersje systemu Windows:Supported Windows versions:

  • System Windows 7 lub nowszyWindows 7 or later
  • Windows Server 2008 R2 lub nowszyWindows Server 2008 R2 or later

Wyświetl lub pobierz przykładowy kod (jak pobrać)View or download sample code (how to download)

Kiedy używać protokołu HTTP. sysWhen to use HTTP.sys

Metoda HTTP. sys jest przydatna w przypadku wdrożeń, w których:HTTP.sys is useful for deployments where:

  • Istnieje potrzeba bezpośredniego udostępnienia serwera w Internecie bez korzystania z usług IIS.There's a need to expose the server directly to the Internet without using IIS.

    Protokół HTTP. sys komunikuje się bezpośrednio z Internetem

  • Wdrożenie wewnętrzne wymaga, aby funkcja była niedostępna w Kestrel, taka jak uwierzytelnianie systemu Windows.An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    Protokół HTTP. sys komunikuje się bezpośrednio z siecią wewnętrzną

HTTP. sys jest doskonałym technologią chroniącą przed wieloma typami ataków i zapewnia niezawodność, bezpieczeństwo i skalowalność w pełni funkcjonalny serwer sieci Web.HTTP.sys is mature technology that protects against many types of attacks and provides the robustness, security, and scalability of a full-featured web server. Usługi IIS działają jako odbiornik HTTP na serwerze HTTP. sys.IIS itself runs as an HTTP listener on top of HTTP.sys.

Obsługa protokołu HTTP/2HTTP/2 support

Protokół HTTP/2 jest włączony dla aplikacji ASP.NET Core, jeśli spełnione są następujące wymagania podstawowe:HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

W przypadku nawiązania połączenia HTTP/2 raporty HttpRequest. Protocol HTTP/1.1 .If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/1.1.

Protokół HTTP/2 jest domyślnie włączony.HTTP/2 is enabled by default. Jeśli połączenie HTTP/2 nie zostało ustanowione, połączenie powraca do protokołu HTTP/1.1.If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. W przyszłych wydaniach systemu Windows są dostępne flagi konfiguracji protokołu HTTP/2, w tym możliwość wyłączenia protokołu HTTP/2 przy użyciu protokołu HTTP. sys.In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Uwierzytelnianie w trybie jądra przy użyciu protokołu KerberosKernel mode authentication with Kerberos

Serwer HTTP. sys deleguje do uwierzytelniania w trybie jądra przy użyciu protokołu uwierzytelniania Kerberos.HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Uwierzytelnianie w trybie użytkownika nie jest obsługiwane w przypadku protokołów Kerberos i HTTP. sys.User mode authentication isn't supported with Kerberos and HTTP.sys. Konto komputera musi służyć do odszyfrowywania tokenu lub biletu Kerberos uzyskanych z Active Directory i przesłanych przez klienta na serwer w celu uwierzytelnienia użytkownika.The machine account must be used to decrypt the Kerberos token/ticket that's obtained from Active Directory and forwarded by the client to the server to authenticate the user. Zarejestruj główną nazwę usługi (SPN) dla hosta, a nie użytkownika aplikacji.Register the Service Principal Name (SPN) for the host, not the user of the app.

Jak używać protokołu HTTP. sysHow to use HTTP.sys

Skonfiguruj aplikację ASP.NET Core do korzystania z protokołu HTTP. sysConfigure the ASP.NET Core app to use HTTP.sys

Odwołanie do pakietu w pliku projektu nie jest wymagane w przypadku korzystania z pakietu Microsoft. AspNetCore. appbinding (NuGet.org).A package reference in the project file isn't required when using the Microsoft.AspNetCore.App metapackage (nuget.org). Gdy nie korzystasz z Microsoft.AspNetCore.App pakietu, Dodaj odwołanie do pakietu do Microsoft. AspNetCore. Server. HttpSys.When not using the Microsoft.AspNetCore.App metapackage, add a package reference to Microsoft.AspNetCore.Server.HttpSys.

Wywołaj UseHttpSys metodę rozszerzającą podczas kompilowania hosta, określając wszystkie wymagane HttpSysOptions .Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. Poniższy przykład ustawia wartości domyślne dla opcji:The following example sets options to their default values:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseHttpSys(options =>
        {
            options.AllowSynchronousIO = true;
            options.Authentication.Schemes = AuthenticationSchemes.None;
            options.Authentication.AllowAnonymous = true;
            options.MaxConnections = null;
            options.MaxRequestBodySize = 30000000;
            options.UrlPrefixes.Add("http://localhost:5000");
        });

Dodatkowa konfiguracja protokołu HTTP. sys jest obsługiwana za pośrednictwem ustawień rejestru.Additional HTTP.sys configuration is handled through registry settings.

Opcje HTTP. sysHTTP.sys options

| WłaściwośćProperty | OpisDescription | DomyślneDefault | | --- title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

---- | ---title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:---- | --- title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'

  • 'Identity''Identity'

  • 'Let's Encrypt''Let's Encrypt'

  • 'Razor''Razor'

  • SignalRIdentyfikator UID:'SignalR' uid:

title: Author: Description: monikerRange: MS. Author: MS. Custom: MS. Date: No-Loc:title: author: description: monikerRange: ms.author: ms.custom: ms.date: no-loc:

  • 'Blazor''Blazor'
  • 'Identity''Identity'
  • 'Let's Encrypt''Let's Encrypt'
  • 'Razor''Razor'
  • SignalRIdentyfikator UID:'SignalR' uid:

------ | :-----: | | AllowSynchronousIO | Określ, czy synchroniczne dane wejściowe/wyjściowe są dozwolone dla HttpContext.Request.Body i HttpContext.Response.Body .------ | :-----: | | AllowSynchronousIO | Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. | true| | Authentication. AllowAnonymous | Zezwalaj na żądania anonimowe. | true | | Authentication.AllowAnonymous | Allow anonymous requests. | true| | Uwierzytelnianie. schematy | Określ dozwolone schematy uwierzytelniania. | true | | Authentication.Schemes | Specify the allowed authentication schemes. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.May be modified at any time prior to disposing the listener. Wartości są dostarczane przez Wyliczenie AuthenticationSchemes: Basic ,, Kerberos , Negotiate None i NTLM .Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. | None| | EnableResponseCaching | Próba buforowania trybu jądra dla odpowiedzi z uprawnionymi nagłówkami. | None | | EnableResponseCaching | Attempt kernel-mode caching for responses with eligible headers. Odpowiedź nie może zawierać Set-Cookie nagłówków, Vary , ani Pragma .The response may not include Set-Cookie, Vary, or Pragma headers. Musi zawierać Cache-Control nagłówek, który jest, public a lub albo shared-max-age lub max-age Expires .It must include a Cache-Control header that's public and either a shared-max-age or max-age value, or an Expires header. | true| | MaxAccepts | Maksymalna liczba współbieżnych akceptacji. | true | | MaxAccepts | The maximum number of concurrent accepts. | 5 × środowisko.
ProcessorCount
| | MaxConnections | Maksymalna liczba jednoczesnych połączeń do zaakceptowania.
| 5 × Environment.
ProcessorCount
| | MaxConnections | The maximum number of concurrent connections to accept.
Użyj -1 do nieskończoności.Use -1 for infinite. Użyj null , aby użyć ustawienia dla całego komputera w rejestrze.Use null to use the registry's machine-wide setting. | null
(cały komputer(machine-wide
ustawienie) | | MaxRequestBodySize | Zobacz sekcję MaxRequestBodySize .setting) | | MaxRequestBodySize | See the MaxRequestBodySize section. | 30000000 bajtów| 30000000 bytes
(~ 28,6 MB) | | RequestQueueLimit | Maksymalna liczba żądań, które można umieścić w kolejce.(~28.6 MB) | | RequestQueueLimit | The maximum number of requests that can be queued. | 1000 | | ThrowWriteExceptions | Wskaż, czy zapisy treści odpowiedzi nie powiodą się, ponieważ rozłączenia klienta nie powiedzie się, jeśli wyjątki lub są normalnie kompletne.| 1000 | | ThrowWriteExceptions | Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. | false
(pełna zwykła) | | Timeouts | Uwidocznić konfigurację HTTP. sys TimeoutManager , która może być również skonfigurowana w rejestrze.(complete normally) | | Timeouts | Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. Postępuj zgodnie z linkami interfejsu API, aby dowiedzieć się więcej na temat każdego ustawienia, w tym wartości domyślnych:Follow the API links to learn more about each setting, including default values:

| | | UrlPrefixes | Określ, UrlPrefixCollection Aby zarejestrować się w pliku http. sys.| | | UrlPrefixes | Specify the UrlPrefixCollection to register with HTTP.sys. Najbardziej przydatne jest UrlPrefixCollection. Add, który służy do dodawania prefiksu do kolekcji.The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. Można je zmodyfikować w dowolnym momencie przed wyjęciem odbiornika.These may be modified at any time prior to disposing the listener. | || |

MaxRequestBodySizeMaxRequestBodySize

Maksymalny dozwolony rozmiar dowolnej treści żądania w bajtach.The maximum allowed size of any request body in bytes. W przypadku ustawienia wartości null Maksymalna wielkość treści żądania jest nieograniczona.When set to null, the maximum request body size is unlimited. Ten limit nie ma wpływu na uaktualnione połączenia, które są zawsze nieograniczone.This limit has no effect on upgraded connections, which are always unlimited.

Zalecaną metodą przesłonięcia limitu w aplikacji ASP.NET Core MVC dla pojedynczej IActionResult jest użycie RequestSizeLimitAttribute atrybutu dla metody akcji:The recommended method to override the limit in an ASP.NET Core MVC app for a single IActionResult is to use the RequestSizeLimitAttribute attribute on an action method:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Wyjątek jest zgłaszany, jeśli aplikacja próbuje skonfigurować limit żądania po rozpoczęciu odczytywania żądania przez aplikację.An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnlyWłaściwość może służyć do wskazywania MaxRequestBodySize , czy właściwość jest w stanie tylko do odczytu, co oznacza, że jest zbyt późno, aby skonfigurować limit.An IsReadOnly property can be used to indicate if the MaxRequestBodySize property is in a read-only state, meaning it's too late to configure the limit.

Jeśli aplikacja powinna przesłonić MaxRequestBodySize żądanie, użyj IHttpMaxRequestBodySizeFeature :If the app should override MaxRequestBodySize per-request, use the IHttpMaxRequestBodySizeFeature:

public void Configure(IApplicationBuilder app, IHostingEnvironment 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.UseHsts();
    }

    // Enable HTTPS Redirection Middleware when hosting the app securely.
    //app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseMvc();
}

Jeśli używasz programu Visual Studio, upewnij się, że aplikacja nie jest skonfigurowana do uruchamiania usług IIS ani IIS Express.If using Visual Studio, make sure the app isn't configured to run IIS or IIS Express.

W programie Visual Studio domyślny profil uruchamiania jest przeznaczony dla IIS Express.In Visual Studio, the default launch profile is for IIS Express. Aby uruchomić projekt jako aplikację konsolową, należy ręcznie zmienić wybrany profil, jak pokazano na poniższym zrzucie ekranu:To run the project as a console app, manually change the selected profile, as shown in the following screen shot:

Wybierz profil aplikacji konsoli

Konfigurowanie systemu Windows ServerConfigure Windows Server

  1. Określ porty do otwarcia dla aplikacji i Użyj zapory systemu Windows lub polecenia cmdlet New-NetFirewallRule programu PowerShell, aby otworzyć porty zapory w celu zezwolenia na ruch do pliku http. sys.Determine the ports to open for the app and use Windows Firewall or the New-NetFirewallRule PowerShell cmdlet to open firewall ports to allow traffic to reach HTTP.sys. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  2. Podczas wdrażania na maszynie wirtualnej platformy Azure Otwórz porty w sieciowej grupie zabezpieczeń.When deploying to an Azure VM, open the ports in the Network Security Group. W poniższych poleceniach i konfiguracji aplikacji jest używany port 443.In the following commands and app configuration, port 443 is used.

  3. Uzyskaj i zainstaluj certyfikaty X. 509, jeśli jest to wymagane.Obtain and install X.509 certificates, if required.

    W systemie Windows utwórz certyfikaty z podpisem własnym za pomocą polecenia cmdlet New-SelfSignedCertificate programu PowerShell.On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. Aby zapoznać się z nieobsługiwanym przykładem, zobacz UpdateIISExpressSSLForChrome. ps1.For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    Zainstaluj certyfikaty z podpisem własnym lub certyfikat podpisany przez urząd certyfikacji w magazynie Local Machine > osobistym komputera lokalnego na serwerze.Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. Jeśli aplikacja jest wdrożeniem zależnym od platformy, zainstaluj platformę .net core, .NET Framework lub obie (Jeśli aplikacja jest aplikacją platformy .NET Core przeznaczoną dla .NET Framework).If the app is a framework-dependent deployment, install .NET Core, .NET Framework, or both (if the app is a .NET Core app targeting the .NET Framework).

    Jeśli aplikacja jest wdrożeniemniezależnym, aplikacja zawiera środowisko uruchomieniowe w ramach wdrożenia.If the app is a self-contained deployment, the app includes the runtime in its deployment. Na serwerze nie jest wymagana instalacja platformy.No framework installation is required on the server.

  5. Skonfiguruj adresy URL i porty w aplikacji.Configure URLs and ports in the app.

    Domyślnie ASP.NET Core wiąże się z http://localhost:5000 .By default, ASP.NET Core binds to http://localhost:5000. Aby skonfigurować prefiksy i porty adresów URL, dostępne są następujące opcje:To configure URL prefixes and ports, options include:

    • UseUrls
    • urlsargument wiersza poleceniaurls command-line argument
    • ASPNETCORE_URLSZmienna środowiskowaASPNETCORE_URLS environment variable
    • UrlPrefixes

    Poniższy przykład kodu pokazuje, jak używać UrlPrefixes z lokalnym adresem IP serwera 10.0.0.4 na porcie 443:The following code example shows how to use UrlPrefixes with the server's local IP address 10.0.0.4 on port 443:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                options.UrlPrefixes.Add("https://10.0.0.4:443");
            });
    

    Zaletą UrlPrefixes jest to, że komunikat o błędzie jest generowany natychmiast dla nieprawidłowo sformatowanych prefiksów.An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    Ustawienia w UrlPrefixes ustawieniach zastąpień UseUrls / urls / ASPNETCORE_URLS .The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. Z tego względu zaletą UseUrls , urls , i ASPNETCORE_URLS zmiennej środowiskowej jest łatwiejsze przełączanie między Kestrel i http. sys.Therefore, an advantage of UseUrls, urls, and the ASPNETCORE_URLS environment variable is that it's easier to switch between Kestrel and HTTP.sys.

    HTTP. sys używa formatów ciągu UrlPrefix interfejsu API serwera http.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    Ostrzeżenie

    http://*:80/ http://+:80 Nie należy używać powiązań z symbolami wieloznacznymi (i) najwyższego poziomu.Top-level wildcard bindings (http://*:80/ and http://+:80) should not be used. Powiązania z symbolami wieloznacznymi najwyższego poziomu tworzy luki w zabezpieczeniach aplikacji.Top-level wildcard bindings create app security vulnerabilities. Dotyczy to zarówno silnych, jak i słabych symboli wieloznacznych.This applies to both strong and weak wildcards. Używaj jawnych nazw hostów lub adresów IP, a nie symboli wieloznacznych.Use explicit host names or IP addresses rather than wildcards. Powiązanie symboli wieloznacznych w poddomenie (np *.mysub.com .) nie jest zagrożeniem bezpieczeństwa, jeśli kontrolujesz całą domenę nadrzędną (w przeciwieństwie do *.com , która jest narażona).Subdomain wildcard binding (for example, *.mysub.com) isn't a security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). Aby uzyskać więcej informacji, zobacz RFC 7230: sekcja 5,4: Host.For more information, see RFC 7230: Section 5.4: Host.

  6. Przedrejestruj prefiksy adresów URL na serwerze.Preregister URL prefixes on the server.

    Wbudowane narzędzie do konfigurowania protokołu HTTP. sys to netsh. exe.The built-in tool for configuring HTTP.sys is netsh.exe. netsh. exe służy do zastrzegania PREFIKSÓW adresów URL i przypisywania certyfikatów X. 509.netsh.exe is used to reserve URL prefixes and assign X.509 certificates. Narzędzie wymaga uprawnień administratora.The tool requires administrator privileges.

    Użyj narzędzia netsh. exe , aby zarejestrować adresy URL dla aplikacji:Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>: W pełni kwalifikowany adres URL (Uniform Resource Locator).<URL>: The fully qualified Uniform Resource Locator (URL). Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowej nazwy hosta lub lokalnego adresu IP.Use a valid hostname or local IP address. Adres URL musi zawierać końcowy ukośnik.The URL must include a trailing slash.
    • <USER>: Określa nazwę użytkownika lub grupy użytkowników.<USER>: Specifies the user or user-group name.

    W poniższym przykładzie lokalny adres IP serwera 10.0.0.4 :In the following example, the local IP address of the server is 10.0.0.4:

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

    Po zarejestrowaniu adresu URL narzędzie reaguje na URL reservation successfully added .When a URL is registered, the tool responds with URL reservation successfully added.

    Aby usunąć zarejestrowany adres URL, użyj delete urlacl polecenia:To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. Zarejestruj certyfikaty X. 509 na serwerze.Register X.509 certificates on the server.

    Użyj narzędzia netsh. exe do rejestrowania certyfikatów dla aplikacji:Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>: Określa lokalny adres IP dla powiązania.<IP>: Specifies the local IP address for the binding. Nie używaj powiązania z symbolami wieloznacznymi.Don't use a wildcard binding. Użyj prawidłowego adresu IP.Use a valid IP address.
    • <PORT>: Określa port dla powiązania.<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>: Odcisk palca certyfikatu X. 509.<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>: Generowany przez deweloper identyfikator GUID reprezentujący aplikację do celów informacyjnych.<GUID>: A developer-generated GUID to represent the app for informational purposes.

    W celach referencyjnych Zapisz identyfikator GUID w aplikacji jako tag pakietu:For reference purposes, store the GUID in the app as a package tag:

    • W programie Visual Studio:In Visual Studio:
      • Otwórz właściwości projektu aplikacji, klikając prawym przyciskiem myszy aplikację w Eksplorator rozwiązań i wybierając pozycję Właściwości.Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • Wybierz kartę pakiet .Select the Package tab.
      • Wprowadź identyfikator GUID, który został utworzony w polu Tagi .Enter the GUID that you created in the Tags field.
    • Gdy nie korzystasz z programu Visual Studio:When not using Visual Studio:
      • Otwórz plik projektu aplikacji.Open the app's project file.

      • Dodaj <PackageTags> Właściwość do nowej lub istniejącej <PropertyGroup> przy użyciu identyfikatora GUID, który został utworzony:Add a <PackageTags> property to a new or existing <PropertyGroup> with the GUID that you created:

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

    W poniższym przykładzie:In the following example:

    • Lokalny adres IP serwera to 10.0.0.4 .The local IP address of the server is 10.0.0.4.
    • W trybie Online Generator losowy identyfikator GUID zawiera appid wartość.An online random GUID generator provides the appid value.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Po zarejestrowaniu certyfikatu narzędzie reaguje na SSL Certificate successfully added .When a certificate is registered, the tool responds with SSL Certificate successfully added.

    Aby usunąć rejestrację certyfikatu, użyj delete sslcert polecenia:To delete a certificate registration, use the delete sslcert command:

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

    Dokumentacja referencyjna dla programu netsh. exe:Reference documentation for netsh.exe:

  8. Uruchom aplikację.Run the app.

    Uprawnienia administratora nie są wymagane do uruchomienia aplikacji w przypadku powiązania z hostem localhost przy użyciu protokołu HTTP (nie HTTPS) z numerem portu większym niż 1024.Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. W przypadku innych konfiguracji (na przykład przy użyciu lokalnego adresu IP lub powiązania z portem 443) Uruchom aplikację z uprawnieniami administratora.For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    Aplikacja odpowiada na publiczny adres IP serwera.The app responds at the server's public IP address. W tym przykładzie serwer jest osiągalny z Internetu przy użyciu publicznego adresu IP 104.214.79.47 .In this example, the server is reached from the Internet at its public IP address of 104.214.79.47.

    W tym przykładzie jest używany certyfikat programistyczny.A development certificate is used in this example. Strona ładuje się bezpiecznie po pominięciu ostrzeżenia niezaufanego certyfikatu w przeglądarce.The page loads securely after bypassing the browser's untrusted certificate warning.

    Okno przeglądarki pokazujące załadowana stronę indeksu aplikacji

Scenariusze serwera proxy i modułu równoważenia obciążeniaProxy server and load balancer scenarios

W przypadku aplikacji hostowanych przez protokół HTTP. sys, które współdziałają z żądaniami z Internetu lub sieci firmowej, może być wymagana dodatkowa konfiguracja w przypadku hostowania za serwerami proxy i modułami równoważenia obciążenia.For apps hosted by HTTP.sys that interact with requests from the Internet or a corporate network, additional configuration might be required when hosting behind proxy servers and load balancers. Aby uzyskać więcej informacji, zobacz konfigurowanie ASP.NET Core do pracy z serwerami proxy i usługami równoważenia obciążenia.For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

Zasoby dodatkoweAdditional resources