ASP.NET Core 웹 서버 구현이 HTTP.sysHTTP.sys web server implementation in ASP.NET Core

Tom DykstraChris RossBy Tom Dykstra and Chris Ross

참고

이 항목에는 이상 ASP.NET 코어 2.0에만 적용 됩니다.This topic applies only to ASP.NET Core 2.0 and later. 이전 버전의 ASP.NET Core에서는 HTTP.sys 이름은 WebListener합니다.In earlier versions of ASP.NET Core, HTTP.sys is named WebListener.

HTTP.sys는는 ASP.NET Core 웹 서버로 windows를 실행 하 합니다.HTTP.sys is a web server for ASP.NET Core that runs only on Windows. 상에 구축 되어는 Http.Sys 커널 모드 드라이버합니다.It's built on the Http.Sys kernel mode driver. HTTP.sys는 하는 대신 Kestrel Kestel 하지 않는 일부 기능을 제공 하는 합니다.HTTP.sys is an alternative to Kestrel that offers some features that Kestel doesn't. HTTP.sys와 호환 되지 않습니다 IIS 또는 IIS Express를 사용할 수 없습니다는 ASP.NET Core 모듈합니다.HTTP.sys can't be used with IIS or IIS Express, as it isn't compatible with the ASP.NET Core Module.

HTTP.sys는 다음과 같은 기능을 지원합니다.HTTP.sys supports the following features:

  • Windows 인증Windows Authentication
  • 포트 공유Port sharing
  • SNI https /HTTPS with SNI
  • HTTP/2 tls (Windows 10)HTTP/2 over TLS (Windows 10)
  • 직접 파일 전송Direct file transmission
  • 응답 캐시Response caching
  • Websocket (Windows 8)WebSockets (Windows 8)

지원 되는 Windows 버전:Supported Windows versions:

  • Windows 7 및 Windows Server 2008 R2 이상Windows 7 and Windows Server 2008 R2 and later

보거나 다운로드 샘플 코드 (다운로드 하는 방법을)View or download sample code (how to download)

HTTP.sys를 사용 하는 경우When to use HTTP.sys

HTTP.sys는 IIS를 사용 하지 않고 인터넷에 직접 서버를 노출 해야 하는 배포 하는 데 유용 합니다.HTTP.sys is useful for deployments where you need to expose the server directly to the Internet without using IIS.

HTTP.sys는 인터넷과 직접 통신합니다.

Http.Sys를 기반으로 하기 때문에 HTTP.sys 공격 으로부터 보호에 대 한 역방향 프록시 서버를 필요 하지 않습니다.Because it's built on Http.Sys, HTTP.sys doesn't require a reverse proxy server for protection against attacks. Http.Sys는 많은 유형의 공격 으로부터 보호 하 고 견고성, 보안 및의 모든 기능을 갖춘 웹 서버 확장성을 제공 하는 완성도 높은 기술입니다.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. 자체 IIS는 HTTP 수신기 Http.Sys 기반으로 실행 됩니다.IIS itself runs as an HTTP listener on top of Http.Sys.

HTTP.sys는 내부 배포에 대 한 좋은 선택 기능에서에서 사용할 수 없는 Kestrel, 예: Windows 인증을 해야 합니다.HTTP.sys is a good choice for internal deployments when you need a feature not available in Kestrel, such as Windows authentication.

HTTP.sys는 내부 네트워크와 직접 통신합니다.

HTTP.sys를 사용 하는 방법How to use HTTP.sys

호스트 OS 및 ASP.NET Core 응용 프로그램에 대 한 설치 작업의 개요는 다음과 같습니다.Here's an overview of setup tasks for the host OS and your ASP.NET Core application.

Windows Server를 구성 합니다.Configure Windows Server

  • 버전의 응용 프로그램에 필요한와 같은.NET 설치 .NET Core 또는 .NET Framework합니다.Install the version of .NET that your application requires, such as .NET Core or .NET Framework.

  • HTTP.sys에 바인딩 및 SSL 인증서를 설정에 대 한 URL 접두사를 미리 등록Preregister URL prefixes to bind to HTTP.sys, and set up SSL certificates

    Windows의 URL 접두사를 미리 등록 하지 않는 경우 관리자 권한으로 응용 프로그램을 실행 해야 합니다.If you don't preregister URL prefixes in Windows, you have to run your application with administrator privileges. 유일한 예외는 HTTP (HTTPS)을 사용 하 여 포트 번호를 1024; 개를 사용 하는 localhost에 바인딩할 경우 이 경우 관리자 권한이 필요 없습니다.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.

    자세한 내용은 참조 접두사 'asverify' 및 SSL을 구성 하는 방법 이 문서의 뒷부분에 나오는 합니다.For details, see How to preregister prefixes and configure SSL later in this article.

  • HTTP.sys에 도달 하도록 허용 하려면 방화벽 포트를 엽니다.Open firewall ports to allow traffic to reach HTTP.sys.

    사용할 수 있습니다 netsh.exe 또는 PowerShell cmdlet합니다.You can use netsh.exe or PowerShell cmdlets.

또한 Http.Sys 레지스트리 설정합니다.There are also Http.Sys registry settings.

HTTP.sys를 사용 하도록 ASP.NET Core 응용 프로그램 구성Configure your ASP.NET Core application to use HTTP.sys

  • 사용 하는 경우 필요 없는 패키지 설치는 Microsoft.AspNetCore.All metapackage 합니다.No package install is needed if you use the Microsoft.AspNetCore.All metapackage. Microsoft.AspNetCore.Server.HttpSys 패키지는 metapackage에 포함 됩니다.The Microsoft.AspNetCore.Server.HttpSys package is included in the metapackage.

  • 호출 된 UseHttpSys 확장 메서드를 WebHostBuilder 에 프로그램 Main 메서드를 지정 하 HTTP.sys 옵션 다음 예제와 같이 필요한: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();
    

HTTP.sys 옵션 구성Configure HTTP.sys options

다음은 HTTP.sys 설정 및 구성할 수 있는 제한의 일부입니다.Here are some of the HTTP.sys settings and limits that you can configure.

최대 클라이언트 연결Maximum client connections

다음 코드는 전체 응용 프로그램에 대 한 동시에 열린 TCP 연결의 최대 수를 설정할 수 있습니다 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");
})

연결의 최대 수는 기본적으로 무제한 (null).The maximum number of connections is unlimited (null) by default.

최대 요청 본문 크기Maximum request body size

기본 최대 요청 본문 크기는 약 28.6 m B 인 30,000,000 바이트입니다.The default maximum request body size is 30,000,000 bytes, which is approximately 28.6MB.

사용 하는 ASP.NET Core MVC 응용 프로그램에 대 한도 무시 하는 권장된 방법은 RequestSizeLimit 작업 메서드에 특성: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()

전체 응용 프로그램을 모든 요청에 대 한 제약 조건을 구성 하는 방법을 보여 주는 예제는 다음과 같습니다.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");
})

특정 요청에 대 한 설정을 재정의할 수 있습니다 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>");
    });
}

응용 프로그램 요청 읽기 시작 된 후 요청에 대 한 제한을 구성 하려고 하면 예외가 throw 됩니다.An exception is thrown if you try to configure the limit on a request after the application has started reading the request. IsReadOnly 를 알려 주는 속성 경우는 MaxRequestBodySize 제한을 구성 하려면에 너무 늦었습니다 의미 속성은 읽기 전용 상태에서입니다.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.

다른 HTTP.sys 옵션에 대 한 정보를 참조 하십시오. HttpSysOptions합니다.For information about other HTTP.sys options, see HttpSysOptions.

Url 및 포트에서 수신 하도록 구성Configure URLs and ports to listen on

기본적으로 ASP.NET Core을 바인딩합니다 http://localhost:5000합니다.By default ASP.NET Core binds to http://localhost:5000. URL 접두사와 포트를 구성 하려면 사용할 수 있습니다는 UseUrls 확장 메서드는 urls 명령줄 인수를 ASPNETCORE_URLS 환경 변수 또는 UrlPrefixes 속성 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. 다음 코드 예제에서는 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();

경우의 이점은 UrlPrefixes 는 수를 가져올 오류 메시지가 즉시 서식이 잘못 지정 된 접두사를 추가 하려고 합니다.An advantage of UrlPrefixes is that you get an error message immediately if you try to add a prefix that is formatted wrong. 경우의 이점은 UseUrls (공유 하면 urls 및 ASPNETCORE_URLS) 보다 쉽게 Kestrel 고 HTTP.sys 파일 간에 전환할 수는 있습니다.An advantage of UseUrls (shared with urls and ASPNETCORE_URLS) is that you can more easily switch between Kestrel and HTTP.sys.

둘 다 사용 하는 경우 UseUrls (또는 urls 또는 ASPNETCORE_URLS) 및 UrlPrefixes에서 설정을 UrlPrefixes 재정의 UseUrls합니다.If you use both UseUrls (or urls or ASPNETCORE_URLS) and UrlPrefixes, the settings in UrlPrefixes override the ones in UseUrls. 자세한 내용은 참조 호스팅합니다.For more information, see Hosting.

HTTP.sys를 사용 하는 HTTP 서버 API UrlPrefix 문자열 형식은합니다.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

참고

에 동일한 접두사 문자열을 지정 해야 UseUrls 또는 UrlPrefixes 서버의 __'asverify'__입니다.Make sure that you specify the same prefix strings in UseUrls or UrlPrefixes that you preregister on the server.

IIS를 사용 하지 마십시오Don't use IIS

응용 프로그램은 IIS 또는 IIS Express를 실행 하도록 구성 되지 않았습니다 있는지 확인 합니다.Make sure your application isn't configured to run IIS or IIS Express.

Visual Studio에서 기본 실행 프로필은 IIS Express 합니다.In Visual Studio, the default launch profile is for IIS Express. 콘솔 응용 프로그램 프로젝트를 실행 하려면 다음 스크린 샷에 표시 된 것 처럼 선택한 프로필까지 변경 수동으로.To run the project as a console application, manually change the selected profile, as shown in the following screen shot.

콘솔 응용 프로그램 프로필 선택

URL 접두사 'asverify' 및 SSL 구성Preregister URL prefixes and configure SSL

HTTP.sys와 IIS 기본 Http.Sys 커널 모드 드라이버 요청을 수신 하 고 초기 처리를 수행 합니다.Both IIS and HTTP.sys rely on the underlying Http.Sys kernel mode driver to listen for requests and do initial processing. Iis에서 관리 UI 제공 모든 항목을 구성 하는 상대적으로 쉬운 방법이 합니다.In IIS, the management UI gives you a relatively easy way to configure everything. 그러나 Http.Sys를 직접 구성 해야 합니다.However, you need to configure Http.Sys yourself. 즉 수행 하는 데 기본 제공 도구 netsh.exe합니다.The built-in tool for doing that is netsh.exe.

netsh.exe URL 접두사를 예약 하 고 SSL 인증서를 할당할 수 있습니다.With netsh.exe you can reserve URL prefixes and assign SSL certificates. 이 도구는 관리 권한이 필요합니다.The tool requires administrative privileges.

다음 예제에서는 포트 80 및 443에 대 한 URL 접두사를 예약 하는 데 필요한 최소: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

다음 예제에는 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}"

여기에 대 한 참조 설명서는 netsh.exe:Here is the reference documentation for netsh.exe:

다음 리소스는 여러 시나리오에 대 한 자세한 지침을 제공 합니다.The following resources provide detailed instructions for several scenarios. HttpListener를 참조 하는 문서 Http.Sys를 기반으로 둘 다으로 HTTP.sys에 동일 하 게 적용 됩니다.Articles that refer to HttpListener apply equally to HTTP.sys, as both are based on Http.Sys.

다음은 보다 사용 하기 쉽게 될 수 있는 몇 가지 타사 도구는 netsh.exe 명령줄입니다.Here are some third-party tools that can be easier to use than the netsh.exe command line. 제공 되거나 Microsoft에서 보증 되지 이러한 합니다.These are not provided by or endorsed by Microsoft. 도구는 관리자 권한으로 실행 기본적으로 이후 netsh.exe 자체 하려면 관리자 권한이 필요 합니다.The tools run as administrator by default, since netsh.exe itself requires administrator privileges.

  • http.sys 관리자 목록에 대 한 UI를 제공 하 고 예약, 접두사 및 인증서 신뢰 목록이 SSL 인증서 및 옵션을 구성 합니다.http.sys Manager provides UI for listing and configuring SSL certificates and options, prefix reservations, and certificate trust lists.
  • HttpConfig 나열 하거나 SSL 인증서와 URL 접두사를 구성할 수 있습니다.HttpConfig lets you list or configure SSL certificates and URL prefixes. UI 관리자 http.sys 보다 성능이 우수 하 고 몇 가지 추가 구성 옵션을 노출 하지만 그렇지 않으면 유사한 기능을 제공 합니다.The UI is more refined than http.sys Manager and exposes a few more configuration options, but otherwise it provides similar functionality. 것 새 인증서 신뢰 목록 (CTL)를 만들 수는 없지만 기존을 할당할 수 있습니다.It cannot create a new certificate trust list (CTL), but can assign existing ones.

Windows에서 자체 서명 된 SSL 인증서를 생성 하기 위한 PowerShell cmdlet을 사용할 수 있습니다 New-selfsignedcertificate합니다.For generating self-signed SSL certificates on Windows, you can use the PowerShell cmdlet New-SelfSignedCertificate. 쉽게 자체 서명 된 인증서를 생성 하는 타사 도구에 대 한 참조 SelfCert합니다.For a third-party tool that makes it easier for you to generate self-signed certificates, see SelfCert.

MacOS 및 Linux에서 만들 수 있습니다를 사용 하 여 자체 서명 된 인증서를 OpenSSL합니다.On macOS and Linux you can create a self-signed certificate using OpenSSL.

다음 단계Next steps

자세한 내용은 다음 리소스를 참조하세요.For more information, see the following resources: