Sterownik HTTP.sys implementacja serwera sieci web platformy ASP.NET CoreHTTP.sys web server implementation in ASP.NET Core

Przez Dykstra Tomasz i Roaming KrzysztofBy Tom Dykstra and Chris Ross

Uwaga

Ten temat dotyczy tylko programu ASP.NET Core 2.0 i nowszych.This topic applies only to ASP.NET Core 2.0 and later. We wcześniejszych wersjach programu ASP.NET Core, nosi nazwę HTTP.sys WebListener.In earlier versions of ASP.NET Core, HTTP.sys is named WebListener.

Sterownik HTTP.sys jest serwera sieci web dla platformy ASP.NET Core , na którym działają tylko w systemie Windows.HTTP.sys is a web server for ASP.NET Core that runs only on Windows. Jest zbudowany na sterownik trybu jądra Http.Sys.It's built on the Http.Sys kernel mode driver. Sterownik HTTP.sys stanowi alternatywę dla Kestrel oferująca niektórych funkcji, które nie Kestel.HTTP.sys is an alternative to Kestrel that offers some features that Kestel doesn't. Składnik HTTP.sys nie można używać z usług IIS lub usług IIS Express, ponieważ nie jest zgodny z platformy ASP.NET Core modułu.HTTP.sys can't be used with IIS or IIS Express, as it's incompatible with the ASP.NET Core Module.

Sterownik HTTP.sys obsługuje następujące funkcje:HTTP.sys supports the following features:

  • Uwierzytelnianie systemu WindowsWindows Authentication
  • Udostępnianie portówPort sharing
  • Protokół HTTPS z SNIHTTPS with SNI
  • HTTP/2 za pośrednictwem protokołu TLS (z systemem Windows 10)HTTP/2 over TLS (Windows 10)
  • Przekazywanie pliku bezpośredniegoDirect file transmission
  • Buforowanie odpowiedziResponse caching
  • Protokół WebSockets (z systemem Windows 8)WebSockets (Windows 8)

Obsługiwane wersje systemu Windows:Supported Windows versions:

  • Windows 7 i Windows Server 2008 R2 lub nowszyWindows 7 and Windows Server 2008 R2 and later

Wyświetlić lub pobrać przykładowy kod (sposobu pobierania)View or download sample code (how to download)

Kiedy należy używać HTTP.sysWhen to use HTTP.sys

Sterownik HTTP.sys jest przydatne w przypadku wdrożeń, których należy udostępnić server bezpośrednio do Internetu, nie za pomocą usług IIS.HTTP.sys is useful for deployments where you need to expose the server directly to the Internet without using IIS.

Sterownik HTTP.sys komunikuje się bezpośrednio z Internetem

Ponieważ jest zbudowany na Http.Sys, sterownik HTTP.sys nie wymaga zwrotnego serwera proxy dla ochrony przed atakami.Because it's built on Http.Sys, HTTP.sys doesn't require a reverse proxy server for protection against attacks. Sterownik Http.Sys jest dojrzała technologia, która chroni przed wiele rodzajów ataków i zapewnia niezawodność, zabezpieczeń i skalowalność serwera sieci web kompletne.Http.Sys is mature technology that protects against many kinds of attacks and provides the robustness, security, and scalability of a full-featured web server. SAM działa jako odbiornik HTTP u góry pliku Http.Sys.IIS itself runs as an HTTP listener on top of Http.Sys.

Sterownik HTTP.sys jest dobrym rozwiązaniem w przypadku wdrożeń wewnętrznego, gdy będziesz potrzebować funkcja nie jest dostępna w Kestrel, takich jak uwierzytelnianie systemu Windows.HTTP.sys is a good choice for internal deployments when you need a feature not available in Kestrel, such as Windows authentication.

Sterownik HTTP.sys komunikuje się bezpośrednio z sieci wewnętrznej

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

Poniżej przedstawiono omówienie zadań instalacji systemu operacyjnego hosta i aplikacji platformy ASP.NET Core.Here's an overview of setup tasks for the host OS and your ASP.NET Core application.

Konfigurowanie systemu Windows ServerConfigure Windows Server

  • Zainstaluj wersję platformy .NET, która wymaga aplikacji, takich jak .NET Core lub .NET Framework.Install the version of .NET that your application requires, such as .NET Core or .NET Framework.

  • Preregister prefiksów URL do powiązania do pliku HTTP.sys i skonfigurować certyfikaty SSLPreregister URL prefixes to bind to HTTP.sys, and set up SSL certificates

    Jeśli nie preregister prefiksy adresów URL w systemie Windows, należy do uruchamiania aplikacji z uprawnieniami administratora.If you don't preregister URL prefixes in Windows, you have to run your application with administrator privileges. Jedynym wyjątkiem jest powiązaniu localhost przy użyciu protokołu HTTP (a nie HTTPS) z większą niż 1024; numeru portu w takim przypadku uprawnienia administratora nie są wymagane.The only exception is if you bind to localhost using HTTP (not HTTPS) with a port number greater than 1024; in that case, administrator privileges aren't required.

    Aby uzyskać więcej informacji, zobacz preregister prefiksy i konfigurowanie protokołu SSL dalszej części tego artykułu.For details, see How to preregister prefixes and configure SSL later in this article.

  • Otwórz porty zapory, aby zezwolić na ruch do pliku HTTP.sys.Open firewall ports to allow traffic to reach HTTP.sys.

    Można użyć netsh.exe lub poleceń cmdlet programu PowerShell.You can use netsh.exe or PowerShell cmdlets.

Dostępne są także ustawienia rejestru Http.Sys.There are also Http.Sys registry settings.

Konfigurowanie aplikacji platformy ASP.NET Core używać HTTP.sysConfigure your ASP.NET Core application to use HTTP.sys

  • Żadna instalacja pakietu jest niezbędny w przypadku używasz Microsoft.AspNetCore.All metapackage.No package install is needed if you use the Microsoft.AspNetCore.All metapackage. Microsoft.AspNetCore.Server.HttpSys pakietu znajduje się w metapackage.The Microsoft.AspNetCore.Server.HttpSys package is included in the metapackage.

  • Wywołanie UseHttpSys — metoda rozszerzenia na WebHostBuilder w Twojej Main metoda określania żadnego opcje HTTP.sys potrzebne, jak pokazano w poniższym przykładzie:Call the UseHttpSys extension method on WebHostBuilder in your Main method, specifying any HTTP.sys options that you need, as shown in the following example:

    public static void Main(string[] args)
    {
        Console.WriteLine("Running demo with HTTP.sys.");
    
        BuildWebHost(args).Run();
    }
    
    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                options.Authentication.Schemes = AuthenticationSchemes.None;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = 100;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5000");
            })
            .Build();
    

Skonfiguruj opcje HTTP.sysConfigure HTTP.sys options

Poniżej przedstawiono niektóre ustawienia HTTP.sys i ograniczeń, które można skonfigurować.Here are some of the HTTP.sys settings and limits that you can configure.

Maksymalna liczba połączeń klientówMaximum client connections

Można ustawić maksymalną liczbę równoczesnych otwartych połączeń TCP dla całej aplikacji w następującym kodem Program.cs:The maximum number of concurrent open TCP connections can be set for the entire application with the following code in Program.cs:

.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.None;
    options.Authentication.AllowAnonymous = true;
    options.MaxConnections = 100;
    options.MaxRequestBodySize = 30000000;
    options.UrlPrefixes.Add("http://localhost:5000");
})

Maksymalna liczba połączeń jest nieograniczony (null) domyślnie.The maximum number of connections is unlimited (null) by default.

Żądanie maksymalny rozmiar treściMaximum request body size

Domyślny rozmiar treści żądania maksymalna jest 30,000,000 bajtów, czyli około 28.6 MB.The default maximum request body size is 30,000,000 bytes, which is approximately 28.6MB.

Zalecanym sposobem zastąpienie limit w aplikacji platformy ASP.NET Core MVC jest użycie RequestSizeLimit atrybutu metody akcji:The recommended way to override the limit in an ASP.NET Core MVC app is to use the RequestSizeLimit attribute on an action method:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Oto przykład, który pokazuje, jak skonfigurować ograniczenia dla całej aplikacji, każde żądanie:Here's an example that shows how to configure the constraint for the entire application, every request:

.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.None;
    options.Authentication.AllowAnonymous = true;
    options.MaxConnections = 100;
    options.MaxRequestBodySize = 30000000;
    options.UrlPrefixes.Add("http://localhost:5000");
})

Można zastąpić ustawienie dla określonego żądania w Startup.cs:You can override the setting on a specific request in Startup.cs:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();

    app.UseStaticFiles();

    app.Run(async (context) =>
    {
        context.Features.Get<IHttpMaxRequestBodySizeFeature>()
            .MaxRequestBodySize = 10 * 1024;

        context.Response.ContentType = "text/html";
        await context.Response.WriteAsync("<p>Hosted by HTTP.sys</p>");

        if (serverAddressesFeature != null)
        {
            await context.Response.WriteAsync($"<p>Listening on the following addresses: {string.Join(", ", serverAddressesFeature.Addresses)}</p>");
        }

        await context.Response.WriteAsync($"<p>Request URL: {context.Request.GetDisplayUrl()}</p>");
    });
}

Jeśli próbujesz skonfigurować limit na żądanie, po uruchomieniu aplikacji odczytu żądania, jest zgłaszany wyjątek.An exception is thrown if you try to configure the limit on a request after the application has started reading the request. Brak IsReadOnly właściwość, która informuje, jeśli MaxRequestBodySize właściwość jest w stanie tylko do odczytu, co oznacza jest za późno skonfigurować limit.There's an IsReadOnly property that tells you if the MaxRequestBodySize property is in read-only state, meaning it's too late to configure the limit.

Aby uzyskać informacje o innych opcjach HTTP.sys, zobacz HttpSysOptions.For information about other HTTP.sys options, see HttpSysOptions.

Skonfiguruj adresy URL i portów do nasłuchiwaniaConfigure URLs and ports to listen on

Domyślnie wiąże platformy ASP.NET Core http://localhost:5000.By default ASP.NET Core binds to http://localhost:5000. Aby skonfigurować prefiksy URL i portów, można użyć UseUrls — metoda rozszerzenia, urls argumentu wiersza polecenia, zmienną środowiskową ASPNETCORE_URLS lub UrlPrefixes właściwość HttpSysOptions.To configure URL prefixes and ports, you can use the UseUrls extension method, the urls command-line argument, the ASPNETCORE_URLS environment variable, or the UrlPrefixes property on HttpSysOptions. Poniższy przykład kodu wykorzystuje UrlPrefixes.The following code example uses UrlPrefixes.

public static void Main(string[] args)
{
    Console.WriteLine("Running demo with HTTP.sys.");

    BuildWebHost(args).Run();
}

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

Zaletą UrlPrefixes jest, że zostanie wyświetlony komunikat o błędzie natychmiast Jeśli próbujesz dodać prefiks, który jest sformatowany problem.An advantage of UrlPrefixes is that you get an error message immediately if you try to add a prefix that is formatted wrong. Zaletą UseUrls (udostępniane urls i ASPNETCORE_URLS) to, że można łatwo przełączać się między Kestrel i sterownik HTTP.sys.An advantage of UseUrls (shared with urls and ASPNETCORE_URLS) is that you can more easily switch between Kestrel and HTTP.sys.

Jeśli używasz zarówno UseUrls (lub urls lub ASPNETCORE_URLS) i UrlPrefixes, ustawienia w UrlPrefixes przesłonić te w UseUrls.If you use both UseUrls (or urls or ASPNETCORE_URLS) and UrlPrefixes, the settings in UrlPrefixes override the ones in UseUrls. Aby uzyskać więcej informacji, zobacz hostingu.For more information, see Hosting.

Korzysta z pliku HTTP.sys formaty ciągu UrlPrefix interfejsu API serwera HTTP.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

Uwaga

Upewnij się, że określono tego samego prefiksu ciągi w UseUrls lub UrlPrefixes który preregister na serwerze.Make sure that you specify the same prefix strings in UseUrls or UrlPrefixes that you preregister on the server.

Nie używaj usług IISDon't use IIS

Upewnij się, że aplikacja nie jest skonfigurowana do uruchamiania usług IIS lub usług IIS Express.Make sure your application isn't configured to run IIS or IIS Express.

W programie Visual Studio domyślnego profilu uruchamiania jest dla usług IIS Express.In Visual Studio, the default launch profile is for IIS Express. Aby uruchomić projekt jako aplikacji konsoli, ręcznie zmienić wybranego profilu, jak pokazano na poniższym zrzucie ekranu.To run the project as a console application, manually change the selected profile, as shown in the following screen shot.

Wybierz profil aplikacji konsoli

Preregister prefiksy URL i skonfigurować protokół SSLPreregister URL prefixes and configure SSL

Zarówno usług IIS, jak i składnik HTTP.sys polegać na podstawowy sterownik trybu jądra Http.Sys do nasłuchiwania żądań i wstępne przetwarzanie.Both IIS and HTTP.sys rely on the underlying Http.Sys kernel mode driver to listen for requests and do initial processing. W usługach IIS interfejs użytkownika zarządzania umożliwia stosunkowo łatwa do skonfigurowania wszystko.In IIS, the management UI gives you a relatively easy way to configure everything. Jednak należy skonfigurować serwer Http.Sys samodzielnie.However, you need to configure Http.Sys yourself. Wbudowane narzędzie do wykonywania, czyli netsh.exe.The built-in tool for doing that is netsh.exe.

Z netsh.exe można zarezerwować prefiksy URL i przypisać certyfikatów SSL.With netsh.exe you can reserve URL prefixes and assign SSL certificates. Narzędzie wymaga uprawnień administracyjnych.The tool requires administrative privileges.

W poniższym przykładzie przedstawiono minimalnej liczbie niezbędnej do zarezerwowania prefiksy URL porty 80 i 443:The following example shows the minimum needed to reserve URL prefixes for ports 80 and 443:

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

Poniższy przykład przedstawia sposób przypisania certyfikatu SSL:The following example shows how to assign an SSL certificate:

netsh http add sslcert ipport=0.0.0.0:443 certhash=MyCertHash_Here appid={00000000-0000-0000-0000-000000000000}"

W tym miejscu znajduje się dokumentacja odwołanie netsh.exe:Here is the reference documentation for netsh.exe:

Następujące zasoby zawierają szczegółowe instrukcje dotyczące kilka scenariuszy.The following resources provide detailed instructions for several scenarios. Artykuły, które odwołują się do HttpListener są stosowane jednakowo do pliku HTTP.sys, zgodnie z obu są oparte na pliku Http.Sys.Articles that refer to HttpListener apply equally to HTTP.sys, as both are based on Http.Sys.

Poniżej przedstawiono niektóre narzędzia innych firm, które mogą być łatwiejsze niż w netsh.exe wiersza polecenia.Here are some third-party tools that can be easier to use than the netsh.exe command line. Nie są one udostępniane przez lub podpisane przez firmę Microsoft.These are not provided by or endorsed by Microsoft. Narzędzia Uruchom jako administrator domyślnie, ponieważ netsh.exe sam wymaga uprawnień administratora.The tools run as administrator by default, since netsh.exe itself requires administrator privileges.

  • Sterownik HTTP.sys Menedżera udostępnia interfejs do listy i konfigurowania certyfikatów SSL i opcji, zastrzeżenia prefiksu i listy zaufanych certyfikatów.http.sys Manager provides UI for listing and configuring SSL certificates and options, prefix reservations, and certificate trust lists.
  • HttpConfig pozwala wyświetlić lub skonfigurować certyfikaty SSL i prefiksy URL.HttpConfig lets you list or configure SSL certificates and URL prefixes. Interfejs użytkownika jest bardziej precyzyjnych niż http.sys Manager i udostępnia kilka więcej opcji konfiguracji, ale w przeciwnym razie zapewnia funkcje podobne.The UI is more refined than http.sys Manager and exposes a few more configuration options, but otherwise it provides similar functionality. Nie można utworzyć nową listę zaufania certyfikatów (CTL), ale można przypisać istniejące.It cannot create a new certificate trust list (CTL), but can assign existing ones.

Podczas generowania certyfikatów SSL z podpisem własnym w systemie Windows, można użyć polecenia cmdlet programu PowerShell SelfSignedCertificate nowy.For generating self-signed SSL certificates on Windows, you can use the PowerShell cmdlet New-SelfSignedCertificate. Narzędzia innych firm, który ułatwia generować certyfikaty z podpisem własnym, zobacz SelfCert.For a third-party tool that makes it easier for you to generate self-signed certificates, see SelfCert.

System macOS i Linux można utworzyć certyfikatu z podpisem własnym za pomocą OpenSSL.On macOS and Linux you can create a self-signed certificate using OpenSSL.

Następne krokiNext steps

Aby uzyskać więcej informacji, zobacz następujące zasoby:For more information, see the following resources: