ASP.NET Core での HTTP.sys Web サーバーの実装HTTP.sys web server implementation in ASP.NET Core

作成者: Tom DykstraChris RossBy Tom Dykstra and Chris Ross

HTTP.sys は、Windows 上でのみ動作する ASP.NET Core 用 Web サーバーです。HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP.sys は Kestrel サーバーの代替製品であり、Kestrel では提供されていない機能がいくつか用意されています。HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

重要

HTTP.sys は ASP.NET Core モジュールと互換性がなく、IIS や IIS Express で使用することはできません。HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

HTTP.sys は、次の機能をサポートします。HTTP.sys supports the following features:

  • Windows 認証Windows Authentication
  • ポート共有Port sharing
  • SNI を使用する HTTPSHTTPS with SNI
  • HTTP/2 over TLS (Windows 10 以降)HTTP/2 over TLS (Windows 10 or later)
  • 直接ファイル伝送Direct file transmission
  • 応答キャッシュResponse caching
  • WebSocket (Windows 8 以降)WebSockets (Windows 8 or later)

サポートされている Windows バージョン:Supported Windows versions:

  • Windows 7 以降Windows 7 or later
  • Windows Server 2008 R2 以降Windows Server 2008 R2 or later

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

HTTP.sys を使用するタイミングWhen to use HTTP.sys

HTTP.sys は、次のような展開に適しています。HTTP.sys is useful for deployments where:

  • IIS を使用せず、インターネットに直接サーバーを公開する必要がある。There's a need to expose the server directly to the Internet without using IIS.

    インターネットと直接通信する HTTP.sys

  • 内部の展開で、Windows 認証などの、Kestrel では使用できない機能が要求されている。An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    内部ネットワークと直接通信する HTTP.sys

HTTP.sys は、さまざまな種類の攻撃を防ぎ、フル機能の 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. IIS 自体が、HTTP.sys 上で HTTP リスナーとして実行されています。IIS itself runs as an HTTP listener on top of HTTP.sys.

HTTP/2 のサポートHTTP/2 support

Http/2 は、次の基本要件が満たされている場合に、ASP.NET Core アプリに対して有効になります。HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

Http/2 接続が確立されると、HttpRequest.ProtocolHTTP/2 を報告します。If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/2.

HTTP/2 は既定で有効になっています。HTTP/2 is enabled by default. Http/2 接続が確立されない場合、接続は http/1.1 にフォールバックします。If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. Windows の今後のリリースで、HTTP.sys で HTTP/2 を無効にする機能を含む HTTP/2 構成フラグが使用可能になる予定です。In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Kerberos を使用したカーネル モード認証Kernel mode authentication with Kerberos

HTTP.sys では、Kerberos 認証プロトコルを使用したカーネル モード認証に処理が委任されます。HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Kerberos および HTTP.sys ではユーザー モード認証がサポートされていません。User mode authentication isn't supported with Kerberos and HTTP.sys. Active Directory から取得され、クライアントによって、ユーザーを認証するサーバーに転送される Kerberos トークン/チケットを暗号化解除するには、コンピューター アカウントを使用する必要があります。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. アプリのユーザーではなく、ホストのサービス プリンシパル名 (SPN) を登録します。Register the Service Principal Name (SPN) for the host, not the user of the app.

HTTP.sys の使用方法How to use HTTP.sys

HTTP.sys を使用するように ASP.NET Core アプリを構成するConfigure the ASP.NET Core app to use HTTP.sys

ホストを構築するときに UseHttpSys 拡張メソッドを呼び出し、必要な HttpSysOptions を指定します。Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. 次の例では、既定値にオプションを設定しています。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>();
        });

HTTP.sys の追加の構成は、レジストリ設定を通じて処理されます。Additional HTTP.sys configuration is handled through registry settings.

HTTP.sys オプションHTTP.sys options

プロパティProperty 説明Description DefaultDefault
AllowSynchronousIOAllowSynchronousIO HttpContext.Request.Body および HttpContext.Response.Body に対して、入力/出力の同期を許可するかどうかを制御します。Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. false
Authentication.AllowAnonymousAuthentication.AllowAnonymous 匿名要求を許可します。Allow anonymous requests. true
Authentication.SchemesAuthentication.Schemes 許可される認証方式を指定します。Specify the allowed authentication schemes. リスナーを破棄する前ならいつでも変更できます。May be modified at any time prior to disposing the listener. 値は AuthenticationSchemes 列挙型 (BasicKerberosNegotiateNone、および NTLM) によって指定します。Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. None
EnableResponseCachingEnableResponseCaching 対象となるヘッダーを持つ応答に対して、カーネル モードのキャッシュを試行します。Attempt kernel-mode caching for responses with eligible headers. Set-CookieVary、または Pragma ヘッダーを含む応答は対象外です。The response may not include Set-Cookie, Vary, or Pragma headers. 応答は、public である Cache-Control ヘッダーと shared-max-age または 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 同時受け入れの最大数です。The maximum number of concurrent accepts. 5 ×Environment.
ProcessorCount
5 × Environment.
ProcessorCount
MaxConnections 受け入れるコンカレント接続の最大数です。The maximum number of concurrent connections to accept. 無限にするには、-1 を使用します。Use -1 for infinite. コンピューター全体のレジストリ設定を使用するには、null を使用します。Use null to use the registry's machine-wide setting. null
(コンピューター全体の(machine-wide
設定)setting)
MaxRequestBodySize MaxRequestBodySize」セクションを参照してください。See the MaxRequestBodySize section. 30000000 バイト30000000 bytes
(~28.6 MB)(~28.6 MB)
RequestQueueLimit キューに置くことができる要求の最大数。The maximum number of requests that can be queued. 10001000
RequestQueueMode これは、サーバーで要求キューの作成と構成を行う必要があるかどうか、または既存のキューにアタッチする必要があるかを示します。This indicates whether the server is responsible for creating and configuring the request queue, or if it should attach to an existing queue.
既存のキューにアタッチする場合、既存の構成オプションのほとんどは適用されません。Most existing configuration options do not apply when attaching to an existing queue.
RequestQueueMode.Create
RequestQueueName HTTP.sys 要求キューの名前。The name of the HTTP.sys request queue. null (匿名キュー)null (Anonymous queue)
ThrowWriteExceptions 応答本文の書き込みがクライアントの接続の切断によって失敗した場合、例外をスローするか、または正常に完了するかどうかを指定します。Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. false
(正常に完了する)(complete normally)
Timeouts HTTP.sys TimeoutManager 構成を公開します。これはレジストリでも構成できます。Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. 各設定に関する既定値などの詳細については、API のリンクを参照してください。Follow the API links to learn more about each setting, including default values:
UrlPrefixes HTTP.sys に登録する UrlPrefixCollection を指定します。Specify the UrlPrefixCollection to register with HTTP.sys. 最も便利なのは UrlPrefixCollection.Add です。これを使用して、コレクションにプレフィックスを追加できます。The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. これらは、リスナーを破棄する前ならいつでも変更できます。These may be modified at any time prior to disposing the listener.

MaxRequestBodySizeMaxRequestBodySize

要求本文の最大許容サイズ (バイト単位) です。The maximum allowed size of any request body in bytes. null に設定する場合、要求本文の最大サイズは制限されません。When set to null, the maximum request body size is unlimited. この制限は、アップグレード済みの接続 (常に無制限) には影響しません。This limit has no effect on upgraded connections, which are always unlimited.

1 つの IActionResult に対する ASP.NET Core MVC アプリの制限をオーバーライドする方法として、アクション メソッドに対して RequestSizeLimitAttribute 属性を使用することをお勧めします。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()

アプリが要求の読み取りを開始した後に、アプリが要求に対する制限を構成しようとすると、例外がスローされます。An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnly プロパティを使用して、MaxRequestBodySize プロパティが読み取り専用状態にあるかどうか、つまり制限を構成するには遅すぎるかどうかを示すことができます。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.

要求ごとにアプリで MaxRequestBodySize をオーバーライドする必要がある場合は、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();
    });
}

Visual Studio を使用する場合は、アプリが IIS または IIS Express を実行するように構成されていないことを確認します。If using Visual Studio, make sure the app 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 app, manually change the selected profile, as shown in the following screen shot:

コンソール アプリのプロファイルを選択する

Windows Server を構成するConfigure Windows Server

  1. アプリに対して開くポートを決めたら、Windows ファイアウォールNew-NetFirewallRule PowerShell コマンドレットを使用して、トラフィックが 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. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  2. Azure VM に展開する場合は、ネットワーク セキュリティ グループ内でポートを開きます。When deploying to an Azure VM, open the ports in the Network Security Group. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  3. 必要に応じて、X.509 証明書を取得してインストールします。Obtain and install X.509 certificates, if required.

    Windows の場合は、New-SelfSignedCertificate PowerShell コマンドレットを使用して自己署名証明書を作成します。On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. サポート対象外の例については、UpdateIISExpressSSLForChrome.ps1 を参照してください。For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    自己署名証明書か CA 署名証明書のいずれかをサーバーの Local Machine>Personal ストアにインストールします。Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. アプリがフレームワークに依存する展開である場合は、.NET Core、.NET Framework、またはその両方 (アプリが .NET Framework をターゲットとする .NET Core アプリである場合) をインストールします。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).

    • .NET Core: アプリで .NET Core が必要な場合は、.NET Core のダウンロードから .NET Core Runtime インストーラーを取得して実行します。.NET Core: If the app requires .NET Core, obtain and run the .NET Core Runtime installer from .NET Core Downloads. サーバーに SDK 全体をインストールしないでください。Don't install the full SDK on the server.
    • .NET Framework:アプリで .NET Framework が必要な場合は、.NET Framework のインストール ガイドを参照してください。.NET Framework: If the app requires .NET Framework, see the .NET Framework installation guide. 必要な .NET Framework をインストールします。Install the required .NET Framework. 最新の .NET Framework のインストーラーは .NET Core のダウンロード ページから入手できます。The installer for the latest .NET Framework is available from the .NET Core Downloads page.

    アプリが自己完結型の展開の場合、アプリの展開内にランタイムが含まれています。If the app is a self-contained deployment, the app includes the runtime in its deployment. サーバーにフレームワークをインストールする必要はありません。No framework installation is required on the server.

  5. アプリに URL とポートを構成します。Configure URLs and ports in the app.

    既定では、ASP.NET Core は http://localhost:5000 にバインドされます。By default, ASP.NET Core binds to http://localhost:5000. URL プレフィックスとポートを構成するには、次のオプションがあります。To configure URL prefixes and ports, options include:

    • UseUrls
    • urls コマンド ライン引数urls command-line argument
    • ASPNETCORE_URLS 環境変数ASPNETCORE_URLS environment variable
    • UrlPrefixes

    次のコード例は、サーバーのローカル IP アドレス 10.0.0.4 を使ってポート 443 上で UrlPrefixes を使う方法を示しています。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>();
            });
    

    UrlPrefixes の利点は、プレフィックスの形式が正しくなかった場合、すぐにエラー メッセージが生成されることです。An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    UrlPrefixes の設定は UseUrls/urls/ASPNETCORE_URLS の設定をオーバーライドします。The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. したがって、UseUrlsurls、および ASPNETCORE_URLS 環境変数の利点は、Kestrel と 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 では、HTTP サーバー API の UrlPrefix 文字列形式が使用されます。HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    警告

    最上位のワイルドカードのバインド ( http://*:80/http://+:80 ) は使用しては いけませんTop-level wildcard bindings (http://*:80/ and http://+:80) should not be used. 最上位のワイルドカードのバインドを使用すると、アプリにセキュリティの脆弱性が生じます。Top-level wildcard bindings create app security vulnerabilities. これは、強力と脆弱の両方のワイルドカードに適用されます。This applies to both strong and weak wildcards. ワイルドカードではなく、明示的なホスト名か IP アドレスを使用してください。Use explicit host names or IP addresses rather than wildcards. 親ドメイン全体を制御する場合、サブドメインのワイルドカードのバインド (たとえば、*.mysub.com) がセキュリティ リスクになることはありません (脆弱である *.com とは対照的)。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). 詳細については、RFC 7230:セクション 5.4:ホストに関するページを参照してください。For more information, see RFC 7230: Section 5.4: Host.

  6. サーバーで URL プレフィックスを事前登録します。Preregister URL prefixes on the server.

    HTTP.sys を構成するための組み込みツールは、netsh.exe です。The built-in tool for configuring HTTP.sys is netsh.exe. netsh.exe を使用して、URL プレフィックスを予約し、X.509 証明書を割り当てることができます。netsh.exe is used to reserve URL prefixes and assign X.509 certificates. ツールを使用するには管理者特権が必要です。The tool requires administrator privileges.

    netsh.exe ツールを使用して、アプリ用に URL を登録します。Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>:完全修飾 URL (Uniform Resource Locator)。<URL>: The fully qualified Uniform Resource Locator (URL). ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効なホスト名かローカル IP アドレスを使用してください。Use a valid hostname or local IP address. "URL の末尾にはスラッシュが必要です。 "The URL must include a trailing slash.
    • <USER>:ユーザーまたはユーザー グループの名前を指定します。<USER>: Specifies the user or user-group name.

    次の例では、サーバーのローカル IP アドレスは 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
    

    URL が登録されると、ツールから URL reservation successfully added という応答があります。When a URL is registered, the tool responds with URL reservation successfully added.

    登録済みの URL を削除するには、delete urlacl コマンドを使用します。To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. サーバーで X.509 証明書を登録します。Register X.509 certificates on the server.

    netsh.exe ツールを使用して、アプリ用の証明書を登録します。Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>:バインド用のローカル IP アドレスを指定します。<IP>: Specifies the local IP address for the binding. ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効な IP アドレスを使用してください。Use a valid IP address.
    • <PORT>:バインド用のポートを指定します。<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>:X.509 証明書の拇印です。<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>:情報提供を目的として開発者によって生成された、アプリを表す GUID です。<GUID>: A developer-generated GUID to represent the app for informational purposes.

    参照用に、この GUID をパッケージ タグとしてアプリに格納します。For reference purposes, store the GUID in the app as a package tag:

    • Visual Studio:In Visual Studio:
      • ソリューション エクスプローラー内でアプリを右クリックし、 [プロパティ] をクリックして、アプリのプロジェクト プロパティを開きます。Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • [パッケージ] タブを選択します。Select the Package tab.
      • 作成した GUID を [タグ] フィールドに入力します。Enter the GUID that you created in the Tags field.
    • Visual Studio を使用しない場合:When not using Visual Studio:
      • アプリのプロジェクト ファイルを開きます。Open the app's project file.

      • 作成した GUID を指定した <PackageTags> プロパティを、新規または既存の <PropertyGroup> に追加します。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>
        

    次に例を示します。In the following example:

    • サーバーのローカル IP アドレスは 10.0.0.4 です。The local IP address of the server is 10.0.0.4.
    • オンラインのランダム GUID ジェネレーターによって、appid の値が提供されます。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}"
    

    証明書が登録されると、ツールから SSL Certificate successfully added という応答があります。When a certificate is registered, the tool responds with SSL Certificate successfully added.

    証明書の登録を削除するには、delete sslcert コマンドを使用します。To delete a certificate registration, use the delete sslcert command:

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

    以下は、netsh.exe のリファレンス ドキュメントです。Reference documentation for netsh.exe:

  8. アプリを実行します。Run the app.

    1024 より大きいポート番号で (HTTPS ではなく) HTTP を使用して localhost にバインドする場合、アプリの実行に管理者権限は必要ありません。Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. その他の構成の場合 (たとえば、ローカル IP アドレスを使用する場合やポート 443 にバインドする場合)、管理者権限でアプリを実行します。For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    サーバーのパブリック IP アドレスでアプリが応答します。The app responds at the server's public IP address. この例では、サーバーは自身のパブリック 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.

    この例では開発証明書が使用されています。A development certificate is used in this example. 証明書が信頼できないというブラウザーの警告がバイパスされた後に、ページが安全に読み込まれます。The page loads securely after bypassing the browser's untrusted certificate warning.

    読み込まれたアプリのインデックス ページを表示するブラウザー ウィンドウ

プロキシ サーバーとロード バランサーのシナリオProxy server and load balancer scenarios

インターネットや企業ネットワークからの要求とやりとりする HTTP.sys でホストされるアプリの場合、プロキシ サーバーやロード バランサーの背後でホストするとき、追加の構成が必要になることがあります。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. 詳細については、「プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成する」を参照してください。For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

その他の技術情報Additional resources

HTTP.sys は、Windows 上でのみ動作する ASP.NET Core 用 Web サーバーです。HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP.sys は Kestrel サーバーの代替製品であり、Kestrel では提供されていない機能がいくつか用意されています。HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

重要

HTTP.sys は ASP.NET Core モジュールと互換性がなく、IIS や IIS Express で使用することはできません。HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

HTTP.sys は、次の機能をサポートします。HTTP.sys supports the following features:

  • Windows 認証Windows Authentication
  • ポート共有Port sharing
  • SNI を使用する HTTPSHTTPS with SNI
  • HTTP/2 over TLS (Windows 10 以降)HTTP/2 over TLS (Windows 10 or later)
  • 直接ファイル伝送Direct file transmission
  • 応答キャッシュResponse caching
  • WebSocket (Windows 8 以降)WebSockets (Windows 8 or later)

サポートされている Windows バージョン:Supported Windows versions:

  • Windows 7 以降Windows 7 or later
  • Windows Server 2008 R2 以降Windows Server 2008 R2 or later

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

HTTP.sys を使用するタイミングWhen to use HTTP.sys

HTTP.sys は、次のような展開に適しています。HTTP.sys is useful for deployments where:

  • IIS を使用せず、インターネットに直接サーバーを公開する必要がある。There's a need to expose the server directly to the Internet without using IIS.

    インターネットと直接通信する HTTP.sys

  • 内部の展開で、Windows 認証などの、Kestrel では使用できない機能が要求されている。An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    内部ネットワークと直接通信する HTTP.sys

HTTP.sys は、さまざまな種類の攻撃を防ぎ、フル機能の 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. IIS 自体が、HTTP.sys 上で HTTP リスナーとして実行されています。IIS itself runs as an HTTP listener on top of HTTP.sys.

HTTP/2 のサポートHTTP/2 support

Http/2 は、次の基本要件が満たされている場合に、ASP.NET Core アプリに対して有効になります。HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

Http/2 接続が確立されると、HttpRequest.ProtocolHTTP/2 を報告します。If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/2.

HTTP/2 は既定で有効になっています。HTTP/2 is enabled by default. Http/2 接続が確立されない場合、接続は http/1.1 にフォールバックします。If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. Windows の今後のリリースで、HTTP.sys で HTTP/2 を無効にする機能を含む HTTP/2 構成フラグが使用可能になる予定です。In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Kerberos を使用したカーネル モード認証Kernel mode authentication with Kerberos

HTTP.sys では、Kerberos 認証プロトコルを使用したカーネル モード認証に処理が委任されます。HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Kerberos および HTTP.sys ではユーザー モード認証がサポートされていません。User mode authentication isn't supported with Kerberos and HTTP.sys. Active Directory から取得され、クライアントによって、ユーザーを認証するサーバーに転送される Kerberos トークン/チケットを暗号化解除するには、コンピューター アカウントを使用する必要があります。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. アプリのユーザーではなく、ホストのサービス プリンシパル名 (SPN) を登録します。Register the Service Principal Name (SPN) for the host, not the user of the app.

HTTP.sys の使用方法How to use HTTP.sys

HTTP.sys を使用するように ASP.NET Core アプリを構成するConfigure the ASP.NET Core app to use HTTP.sys

ホストを構築するときに UseHttpSys 拡張メソッドを呼び出し、必要な HttpSysOptions を指定します。Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. 次の例では、既定値にオプションを設定しています。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>();
        });

HTTP.sys の追加の構成は、レジストリ設定を通じて処理されます。Additional HTTP.sys configuration is handled through registry settings.

HTTP.sys オプションHTTP.sys options

プロパティProperty 説明Description DefaultDefault
AllowSynchronousIOAllowSynchronousIO HttpContext.Request.Body および HttpContext.Response.Body に対して、入力/出力の同期を許可するかどうかを制御します。Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. false
Authentication.AllowAnonymousAuthentication.AllowAnonymous 匿名要求を許可します。Allow anonymous requests. true
Authentication.SchemesAuthentication.Schemes 許可される認証方式を指定します。Specify the allowed authentication schemes. リスナーを破棄する前ならいつでも変更できます。May be modified at any time prior to disposing the listener. 値は AuthenticationSchemes 列挙型 (BasicKerberosNegotiateNone、および NTLM) によって指定します。Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. None
EnableResponseCachingEnableResponseCaching 対象となるヘッダーを持つ応答に対して、カーネル モードのキャッシュを試行します。Attempt kernel-mode caching for responses with eligible headers. Set-CookieVary、または Pragma ヘッダーを含む応答は対象外です。The response may not include Set-Cookie, Vary, or Pragma headers. 応答は、public である Cache-Control ヘッダーと shared-max-age または 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 同時受け入れの最大数です。The maximum number of concurrent accepts. 5 ×Environment.
ProcessorCount
5 × Environment.
ProcessorCount
MaxConnections 受け入れるコンカレント接続の最大数です。The maximum number of concurrent connections to accept. 無限にするには、-1 を使用します。Use -1 for infinite. コンピューター全体のレジストリ設定を使用するには、null を使用します。Use null to use the registry's machine-wide setting. null
(コンピューター全体の(machine-wide
設定)setting)
MaxRequestBodySize MaxRequestBodySize」セクションを参照してください。See the MaxRequestBodySize section. 30000000 バイト30000000 bytes
(~28.6 MB)(~28.6 MB)
RequestQueueLimit キューに置くことができる要求の最大数。The maximum number of requests that can be queued. 10001000
ThrowWriteExceptions 応答本文の書き込みがクライアントの接続の切断によって失敗した場合、例外をスローするか、または正常に完了するかどうかを指定します。Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. false
(正常に完了する)(complete normally)
Timeouts HTTP.sys TimeoutManager 構成を公開します。これはレジストリでも構成できます。Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. 各設定に関する既定値などの詳細については、API のリンクを参照してください。Follow the API links to learn more about each setting, including default values:
UrlPrefixes HTTP.sys に登録する UrlPrefixCollection を指定します。Specify the UrlPrefixCollection to register with HTTP.sys. 最も便利なのは UrlPrefixCollection.Add です。これを使用して、コレクションにプレフィックスを追加できます。The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. これらは、リスナーを破棄する前ならいつでも変更できます。These may be modified at any time prior to disposing the listener.

MaxRequestBodySizeMaxRequestBodySize

要求本文の最大許容サイズ (バイト単位) です。The maximum allowed size of any request body in bytes. null に設定する場合、要求本文の最大サイズは制限されません。When set to null, the maximum request body size is unlimited. この制限は、アップグレード済みの接続 (常に無制限) には影響しません。This limit has no effect on upgraded connections, which are always unlimited.

1 つの IActionResult に対する ASP.NET Core MVC アプリの制限をオーバーライドする方法として、アクション メソッドに対して RequestSizeLimitAttribute 属性を使用することをお勧めします。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()

アプリが要求の読み取りを開始した後に、アプリが要求に対する制限を構成しようとすると、例外がスローされます。An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnly プロパティを使用して、MaxRequestBodySize プロパティが読み取り専用状態にあるかどうか、つまり制限を構成するには遅すぎるかどうかを示すことができます。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.

要求ごとにアプリで MaxRequestBodySize をオーバーライドする必要がある場合は、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();
    });
}

Visual Studio を使用する場合は、アプリが IIS または IIS Express を実行するように構成されていないことを確認します。If using Visual Studio, make sure the app 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 app, manually change the selected profile, as shown in the following screen shot:

コンソール アプリのプロファイルを選択する

Windows Server を構成するConfigure Windows Server

  1. アプリに対して開くポートを決めたら、Windows ファイアウォールNew-NetFirewallRule PowerShell コマンドレットを使用して、トラフィックが 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. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  2. Azure VM に展開する場合は、ネットワーク セキュリティ グループ内でポートを開きます。When deploying to an Azure VM, open the ports in the Network Security Group. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  3. 必要に応じて、X.509 証明書を取得してインストールします。Obtain and install X.509 certificates, if required.

    Windows の場合は、New-SelfSignedCertificate PowerShell コマンドレットを使用して自己署名証明書を作成します。On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. サポート対象外の例については、UpdateIISExpressSSLForChrome.ps1 を参照してください。For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    自己署名証明書か CA 署名証明書のいずれかをサーバーの Local Machine>Personal ストアにインストールします。Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. アプリがフレームワークに依存する展開である場合は、.NET Core、.NET Framework、またはその両方 (アプリが .NET Framework をターゲットとする .NET Core アプリである場合) をインストールします。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).

    • .NET Core: アプリで .NET Core が必要な場合は、.NET Core のダウンロードから .NET Core Runtime インストーラーを取得して実行します。.NET Core: If the app requires .NET Core, obtain and run the .NET Core Runtime installer from .NET Core Downloads. サーバーに SDK 全体をインストールしないでください。Don't install the full SDK on the server.
    • .NET Framework:アプリで .NET Framework が必要な場合は、.NET Framework のインストール ガイドを参照してください。.NET Framework: If the app requires .NET Framework, see the .NET Framework installation guide. 必要な .NET Framework をインストールします。Install the required .NET Framework. 最新の .NET Framework のインストーラーは .NET Core のダウンロード ページから入手できます。The installer for the latest .NET Framework is available from the .NET Core Downloads page.

    アプリが自己完結型の展開の場合、アプリの展開内にランタイムが含まれています。If the app is a self-contained deployment, the app includes the runtime in its deployment. サーバーにフレームワークをインストールする必要はありません。No framework installation is required on the server.

  5. アプリに URL とポートを構成します。Configure URLs and ports in the app.

    既定では、ASP.NET Core は http://localhost:5000 にバインドされます。By default, ASP.NET Core binds to http://localhost:5000. URL プレフィックスとポートを構成するには、次のオプションがあります。To configure URL prefixes and ports, options include:

    • UseUrls
    • urls コマンド ライン引数urls command-line argument
    • ASPNETCORE_URLS 環境変数ASPNETCORE_URLS environment variable
    • UrlPrefixes

    次のコード例は、サーバーのローカル IP アドレス 10.0.0.4 を使ってポート 443 上で UrlPrefixes を使う方法を示しています。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>();
            });
    

    UrlPrefixes の利点は、プレフィックスの形式が正しくなかった場合、すぐにエラー メッセージが生成されることです。An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    UrlPrefixes の設定は UseUrls/urls/ASPNETCORE_URLS の設定をオーバーライドします。The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. したがって、UseUrlsurls、および ASPNETCORE_URLS 環境変数の利点は、Kestrel と 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 では、HTTP サーバー API の UrlPrefix 文字列形式が使用されます。HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    警告

    最上位のワイルドカードのバインド ( http://*:80/http://+:80 ) は使用しては いけませんTop-level wildcard bindings (http://*:80/ and http://+:80) should not be used. 最上位のワイルドカードのバインドを使用すると、アプリにセキュリティの脆弱性が生じます。Top-level wildcard bindings create app security vulnerabilities. これは、強力と脆弱の両方のワイルドカードに適用されます。This applies to both strong and weak wildcards. ワイルドカードではなく、明示的なホスト名か IP アドレスを使用してください。Use explicit host names or IP addresses rather than wildcards. 親ドメイン全体を制御する場合、サブドメインのワイルドカードのバインド (たとえば、*.mysub.com) がセキュリティ リスクになることはありません (脆弱である *.com とは対照的)。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). 詳細については、RFC 7230:セクション 5.4:ホストに関するページを参照してください。For more information, see RFC 7230: Section 5.4: Host.

  6. サーバーで URL プレフィックスを事前登録します。Preregister URL prefixes on the server.

    HTTP.sys を構成するための組み込みツールは、netsh.exe です。The built-in tool for configuring HTTP.sys is netsh.exe. netsh.exe を使用して、URL プレフィックスを予約し、X.509 証明書を割り当てることができます。netsh.exe is used to reserve URL prefixes and assign X.509 certificates. ツールを使用するには管理者特権が必要です。The tool requires administrator privileges.

    netsh.exe ツールを使用して、アプリ用に URL を登録します。Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>:完全修飾 URL (Uniform Resource Locator)。<URL>: The fully qualified Uniform Resource Locator (URL). ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効なホスト名かローカル IP アドレスを使用してください。Use a valid hostname or local IP address. "URL の末尾にはスラッシュが必要です。 "The URL must include a trailing slash.
    • <USER>:ユーザーまたはユーザー グループの名前を指定します。<USER>: Specifies the user or user-group name.

    次の例では、サーバーのローカル IP アドレスは 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
    

    URL が登録されると、ツールから URL reservation successfully added という応答があります。When a URL is registered, the tool responds with URL reservation successfully added.

    登録済みの URL を削除するには、delete urlacl コマンドを使用します。To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. サーバーで X.509 証明書を登録します。Register X.509 certificates on the server.

    netsh.exe ツールを使用して、アプリ用の証明書を登録します。Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>:バインド用のローカル IP アドレスを指定します。<IP>: Specifies the local IP address for the binding. ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効な IP アドレスを使用してください。Use a valid IP address.
    • <PORT>:バインド用のポートを指定します。<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>:X.509 証明書の拇印です。<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>:情報提供を目的として開発者によって生成された、アプリを表す GUID です。<GUID>: A developer-generated GUID to represent the app for informational purposes.

    参照用に、この GUID をパッケージ タグとしてアプリに格納します。For reference purposes, store the GUID in the app as a package tag:

    • Visual Studio:In Visual Studio:
      • ソリューション エクスプローラー内でアプリを右クリックし、 [プロパティ] をクリックして、アプリのプロジェクト プロパティを開きます。Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • [パッケージ] タブを選択します。Select the Package tab.
      • 作成した GUID を [タグ] フィールドに入力します。Enter the GUID that you created in the Tags field.
    • Visual Studio を使用しない場合:When not using Visual Studio:
      • アプリのプロジェクト ファイルを開きます。Open the app's project file.

      • 作成した GUID を指定した <PackageTags> プロパティを、新規または既存の <PropertyGroup> に追加します。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>
        

    次に例を示します。In the following example:

    • サーバーのローカル IP アドレスは 10.0.0.4 です。The local IP address of the server is 10.0.0.4.
    • オンラインのランダム GUID ジェネレーターによって、appid の値が提供されます。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}"
    

    証明書が登録されると、ツールから SSL Certificate successfully added という応答があります。When a certificate is registered, the tool responds with SSL Certificate successfully added.

    証明書の登録を削除するには、delete sslcert コマンドを使用します。To delete a certificate registration, use the delete sslcert command:

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

    以下は、netsh.exe のリファレンス ドキュメントです。Reference documentation for netsh.exe:

  8. アプリを実行します。Run the app.

    1024 より大きいポート番号で (HTTPS ではなく) HTTP を使用して localhost にバインドする場合、アプリの実行に管理者権限は必要ありません。Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. その他の構成の場合 (たとえば、ローカル IP アドレスを使用する場合やポート 443 にバインドする場合)、管理者権限でアプリを実行します。For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    サーバーのパブリック IP アドレスでアプリが応答します。The app responds at the server's public IP address. この例では、サーバーは自身のパブリック 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.

    この例では開発証明書が使用されています。A development certificate is used in this example. 証明書が信頼できないというブラウザーの警告がバイパスされた後に、ページが安全に読み込まれます。The page loads securely after bypassing the browser's untrusted certificate warning.

    読み込まれたアプリのインデックス ページを表示するブラウザー ウィンドウ

プロキシ サーバーとロード バランサーのシナリオProxy server and load balancer scenarios

インターネットや企業ネットワークからの要求とやりとりする HTTP.sys でホストされるアプリの場合、プロキシ サーバーやロード バランサーの背後でホストするとき、追加の構成が必要になることがあります。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. 詳細については、「プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成する」を参照してください。For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

その他の技術情報Additional resources

HTTP.sys は、Windows 上でのみ動作する ASP.NET Core 用 Web サーバーです。HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP.sys は Kestrel サーバーの代替製品であり、Kestrel では提供されていない機能がいくつか用意されています。HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

重要

HTTP.sys は ASP.NET Core モジュールと互換性がなく、IIS や IIS Express で使用することはできません。HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

HTTP.sys は、次の機能をサポートします。HTTP.sys supports the following features:

  • Windows 認証Windows Authentication
  • ポート共有Port sharing
  • SNI を使用する HTTPSHTTPS with SNI
  • HTTP/2 over TLS (Windows 10 以降)HTTP/2 over TLS (Windows 10 or later)
  • 直接ファイル伝送Direct file transmission
  • 応答キャッシュResponse caching
  • WebSocket (Windows 8 以降)WebSockets (Windows 8 or later)

サポートされている Windows バージョン:Supported Windows versions:

  • Windows 7 以降Windows 7 or later
  • Windows Server 2008 R2 以降Windows Server 2008 R2 or later

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

HTTP.sys を使用するタイミングWhen to use HTTP.sys

HTTP.sys は、次のような展開に適しています。HTTP.sys is useful for deployments where:

  • IIS を使用せず、インターネットに直接サーバーを公開する必要がある。There's a need to expose the server directly to the Internet without using IIS.

    インターネットと直接通信する HTTP.sys

  • 内部の展開で、Windows 認証などの、Kestrel では使用できない機能が要求されている。An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    内部ネットワークと直接通信する HTTP.sys

HTTP.sys は、さまざまな種類の攻撃を防ぎ、フル機能の 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. IIS 自体が、HTTP.sys 上で HTTP リスナーとして実行されています。IIS itself runs as an HTTP listener on top of HTTP.sys.

HTTP/2 のサポートHTTP/2 support

Http/2 は、次の基本要件が満たされている場合に、ASP.NET Core アプリに対して有効になります。HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

Http/2 接続が確立されると、HttpRequest.ProtocolHTTP/2 を報告します。If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/2.

HTTP/2 は既定で有効になっています。HTTP/2 is enabled by default. Http/2 接続が確立されない場合、接続は http/1.1 にフォールバックします。If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. Windows の今後のリリースで、HTTP.sys で HTTP/2 を無効にする機能を含む HTTP/2 構成フラグが使用可能になる予定です。In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Kerberos を使用したカーネル モード認証Kernel mode authentication with Kerberos

HTTP.sys では、Kerberos 認証プロトコルを使用したカーネル モード認証に処理が委任されます。HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Kerberos および HTTP.sys ではユーザー モード認証がサポートされていません。User mode authentication isn't supported with Kerberos and HTTP.sys. Active Directory から取得され、クライアントによって、ユーザーを認証するサーバーに転送される Kerberos トークン/チケットを暗号化解除するには、コンピューター アカウントを使用する必要があります。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. アプリのユーザーではなく、ホストのサービス プリンシパル名 (SPN) を登録します。Register the Service Principal Name (SPN) for the host, not the user of the app.

HTTP.sys の使用方法How to use HTTP.sys

HTTP.sys を使用するように ASP.NET Core アプリを構成するConfigure the ASP.NET Core app to use HTTP.sys

Microsoft.AspNetCore.App メタパッケージ (nuget.org) を使用する場合は、プロジェクト ファイルのパッケージ参照は必要ありません。A package reference in the project file isn't required when using the Microsoft.AspNetCore.App metapackage (nuget.org). Microsoft.AspNetCore.App メタパッケージを使用しない場合は、Microsoft.AspNetCore.Server.HttpSys にパッケージ参照を追加します。When not using the Microsoft.AspNetCore.App metapackage, add a package reference to Microsoft.AspNetCore.Server.HttpSys.

ホストを構築するときに UseHttpSys 拡張メソッドを呼び出し、必要な HttpSysOptions を指定します。Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. 次の例では、既定値にオプションを設定しています。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");
        });

HTTP.sys の追加の構成は、レジストリ設定を通じて処理されます。Additional HTTP.sys configuration is handled through registry settings.

HTTP.sys オプションHTTP.sys options

プロパティProperty 説明Description DefaultDefault
AllowSynchronousIOAllowSynchronousIO HttpContext.Request.Body および HttpContext.Response.Body に対して、入力/出力の同期を許可するかどうかを制御します。Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. true
Authentication.AllowAnonymousAuthentication.AllowAnonymous 匿名要求を許可します。Allow anonymous requests. true
Authentication.SchemesAuthentication.Schemes 許可される認証方式を指定します。Specify the allowed authentication schemes. リスナーを破棄する前ならいつでも変更できます。May be modified at any time prior to disposing the listener. 値は AuthenticationSchemes 列挙型 (BasicKerberosNegotiateNone、および NTLM) によって指定します。Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. None
EnableResponseCachingEnableResponseCaching 対象となるヘッダーを持つ応答に対して、カーネル モードのキャッシュを試行します。Attempt kernel-mode caching for responses with eligible headers. Set-CookieVary、または Pragma ヘッダーを含む応答は対象外です。The response may not include Set-Cookie, Vary, or Pragma headers. 応答は、public である Cache-Control ヘッダーと shared-max-age または 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 同時受け入れの最大数です。The maximum number of concurrent accepts. 5 ×Environment.
ProcessorCount
5 × Environment.
ProcessorCount
MaxConnections 受け入れるコンカレント接続の最大数です。The maximum number of concurrent connections to accept. 無限にするには、-1 を使用します。Use -1 for infinite. コンピューター全体のレジストリ設定を使用するには、null を使用します。Use null to use the registry's machine-wide setting. null
(コンピューター全体の(machine-wide
設定)setting)
MaxRequestBodySize MaxRequestBodySize」セクションを参照してください。See the MaxRequestBodySize section. 30000000 バイト30000000 bytes
(~28.6 MB)(~28.6 MB)
RequestQueueLimit キューに置くことができる要求の最大数。The maximum number of requests that can be queued. 10001000
ThrowWriteExceptions 応答本文の書き込みがクライアントの接続の切断によって失敗した場合、例外をスローするか、または正常に完了するかどうかを指定します。Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. false
(正常に完了する)(complete normally)
Timeouts HTTP.sys TimeoutManager 構成を公開します。これはレジストリでも構成できます。Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. 各設定に関する既定値などの詳細については、API のリンクを参照してください。Follow the API links to learn more about each setting, including default values:
UrlPrefixes HTTP.sys に登録する UrlPrefixCollection を指定します。Specify the UrlPrefixCollection to register with HTTP.sys. 最も便利なのは UrlPrefixCollection.Add です。これを使用して、コレクションにプレフィックスを追加できます。The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. これらは、リスナーを破棄する前ならいつでも変更できます。These may be modified at any time prior to disposing the listener.

MaxRequestBodySizeMaxRequestBodySize

要求本文の最大許容サイズ (バイト単位) です。The maximum allowed size of any request body in bytes. null に設定する場合、要求本文の最大サイズは制限されません。When set to null, the maximum request body size is unlimited. この制限は、アップグレード済みの接続 (常に無制限) には影響しません。This limit has no effect on upgraded connections, which are always unlimited.

1 つの IActionResult に対する ASP.NET Core MVC アプリの制限をオーバーライドする方法として、アクション メソッドに対して RequestSizeLimitAttribute 属性を使用することをお勧めします。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()

アプリが要求の読み取りを開始した後に、アプリが要求に対する制限を構成しようとすると、例外がスローされます。An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnly プロパティを使用して、MaxRequestBodySize プロパティが読み取り専用状態にあるかどうか、つまり制限を構成するには遅すぎるかどうかを示すことができます。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.

要求ごとにアプリで MaxRequestBodySize をオーバーライドする必要がある場合は、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();
}

Visual Studio を使用する場合は、アプリが IIS または IIS Express を実行するように構成されていないことを確認します。If using Visual Studio, make sure the app 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 app, manually change the selected profile, as shown in the following screen shot:

コンソール アプリのプロファイルを選択する

Windows Server を構成するConfigure Windows Server

  1. アプリに対して開くポートを決めたら、Windows ファイアウォールNew-NetFirewallRule PowerShell コマンドレットを使用して、トラフィックが 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. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  2. Azure VM に展開する場合は、ネットワーク セキュリティ グループ内でポートを開きます。When deploying to an Azure VM, open the ports in the Network Security Group. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  3. 必要に応じて、X.509 証明書を取得してインストールします。Obtain and install X.509 certificates, if required.

    Windows の場合は、New-SelfSignedCertificate PowerShell コマンドレットを使用して自己署名証明書を作成します。On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. サポート対象外の例については、UpdateIISExpressSSLForChrome.ps1 を参照してください。For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    自己署名証明書か CA 署名証明書のいずれかをサーバーの Local Machine>Personal ストアにインストールします。Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. アプリがフレームワークに依存する展開である場合は、.NET Core、.NET Framework、またはその両方 (アプリが .NET Framework をターゲットとする .NET Core アプリである場合) をインストールします。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).

    • .NET Core: アプリで .NET Core が必要な場合は、.NET Core のダウンロードから .NET Core Runtime インストーラーを取得して実行します。.NET Core: If the app requires .NET Core, obtain and run the .NET Core Runtime installer from .NET Core Downloads. サーバーに SDK 全体をインストールしないでください。Don't install the full SDK on the server.
    • .NET Framework:アプリで .NET Framework が必要な場合は、.NET Framework のインストール ガイドを参照してください。.NET Framework: If the app requires .NET Framework, see the .NET Framework installation guide. 必要な .NET Framework をインストールします。Install the required .NET Framework. 最新の .NET Framework のインストーラーは .NET Core のダウンロード ページから入手できます。The installer for the latest .NET Framework is available from the .NET Core Downloads page.

    アプリが自己完結型の展開の場合、アプリの展開内にランタイムが含まれています。If the app is a self-contained deployment, the app includes the runtime in its deployment. サーバーにフレームワークをインストールする必要はありません。No framework installation is required on the server.

  5. アプリに URL とポートを構成します。Configure URLs and ports in the app.

    既定では、ASP.NET Core は http://localhost:5000 にバインドされます。By default, ASP.NET Core binds to http://localhost:5000. URL プレフィックスとポートを構成するには、次のオプションがあります。To configure URL prefixes and ports, options include:

    • UseUrls
    • urls コマンド ライン引数urls command-line argument
    • ASPNETCORE_URLS 環境変数ASPNETCORE_URLS environment variable
    • UrlPrefixes

    次のコード例は、サーバーのローカル IP アドレス 10.0.0.4 を使ってポート 443 上で UrlPrefixes を使う方法を示しています。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");
            });
    

    UrlPrefixes の利点は、プレフィックスの形式が正しくなかった場合、すぐにエラー メッセージが生成されることです。An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    UrlPrefixes の設定は UseUrls/urls/ASPNETCORE_URLS の設定をオーバーライドします。The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. したがって、UseUrlsurls、および ASPNETCORE_URLS 環境変数の利点は、Kestrel と 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 では、HTTP サーバー API の UrlPrefix 文字列形式が使用されます。HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    警告

    最上位のワイルドカードのバインド ( http://*:80/http://+:80 ) は使用しては いけませんTop-level wildcard bindings (http://*:80/ and http://+:80) should not be used. 最上位のワイルドカードのバインドを使用すると、アプリにセキュリティの脆弱性が生じます。Top-level wildcard bindings create app security vulnerabilities. これは、強力と脆弱の両方のワイルドカードに適用されます。This applies to both strong and weak wildcards. ワイルドカードではなく、明示的なホスト名か IP アドレスを使用してください。Use explicit host names or IP addresses rather than wildcards. 親ドメイン全体を制御する場合、サブドメインのワイルドカードのバインド (たとえば、*.mysub.com) がセキュリティ リスクになることはありません (脆弱である *.com とは対照的)。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). 詳細については、RFC 7230:セクション 5.4:ホストに関するページを参照してください。For more information, see RFC 7230: Section 5.4: Host.

  6. サーバーで URL プレフィックスを事前登録します。Preregister URL prefixes on the server.

    HTTP.sys を構成するための組み込みツールは、netsh.exe です。The built-in tool for configuring HTTP.sys is netsh.exe. netsh.exe を使用して、URL プレフィックスを予約し、X.509 証明書を割り当てることができます。netsh.exe is used to reserve URL prefixes and assign X.509 certificates. ツールを使用するには管理者特権が必要です。The tool requires administrator privileges.

    netsh.exe ツールを使用して、アプリ用に URL を登録します。Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>:完全修飾 URL (Uniform Resource Locator)。<URL>: The fully qualified Uniform Resource Locator (URL). ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効なホスト名かローカル IP アドレスを使用してください。Use a valid hostname or local IP address. "URL の末尾にはスラッシュが必要です。 "The URL must include a trailing slash.
    • <USER>:ユーザーまたはユーザー グループの名前を指定します。<USER>: Specifies the user or user-group name.

    次の例では、サーバーのローカル IP アドレスは 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
    

    URL が登録されると、ツールから URL reservation successfully added という応答があります。When a URL is registered, the tool responds with URL reservation successfully added.

    登録済みの URL を削除するには、delete urlacl コマンドを使用します。To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. サーバーで X.509 証明書を登録します。Register X.509 certificates on the server.

    netsh.exe ツールを使用して、アプリ用の証明書を登録します。Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>:バインド用のローカル IP アドレスを指定します。<IP>: Specifies the local IP address for the binding. ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効な IP アドレスを使用してください。Use a valid IP address.
    • <PORT>:バインド用のポートを指定します。<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>:X.509 証明書の拇印です。<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>:情報提供を目的として開発者によって生成された、アプリを表す GUID です。<GUID>: A developer-generated GUID to represent the app for informational purposes.

    参照用に、この GUID をパッケージ タグとしてアプリに格納します。For reference purposes, store the GUID in the app as a package tag:

    • Visual Studio:In Visual Studio:
      • ソリューション エクスプローラー内でアプリを右クリックし、 [プロパティ] をクリックして、アプリのプロジェクト プロパティを開きます。Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • [パッケージ] タブを選択します。Select the Package tab.
      • 作成した GUID を [タグ] フィールドに入力します。Enter the GUID that you created in the Tags field.
    • Visual Studio を使用しない場合:When not using Visual Studio:
      • アプリのプロジェクト ファイルを開きます。Open the app's project file.

      • 作成した GUID を指定した <PackageTags> プロパティを、新規または既存の <PropertyGroup> に追加します。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>
        

    次に例を示します。In the following example:

    • サーバーのローカル IP アドレスは 10.0.0.4 です。The local IP address of the server is 10.0.0.4.
    • オンラインのランダム GUID ジェネレーターによって、appid の値が提供されます。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}"
    

    証明書が登録されると、ツールから SSL Certificate successfully added という応答があります。When a certificate is registered, the tool responds with SSL Certificate successfully added.

    証明書の登録を削除するには、delete sslcert コマンドを使用します。To delete a certificate registration, use the delete sslcert command:

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

    以下は、netsh.exe のリファレンス ドキュメントです。Reference documentation for netsh.exe:

  8. アプリを実行します。Run the app.

    1024 より大きいポート番号で (HTTPS ではなく) HTTP を使用して localhost にバインドする場合、アプリの実行に管理者権限は必要ありません。Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. その他の構成の場合 (たとえば、ローカル IP アドレスを使用する場合やポート 443 にバインドする場合)、管理者権限でアプリを実行します。For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    サーバーのパブリック IP アドレスでアプリが応答します。The app responds at the server's public IP address. この例では、サーバーは自身のパブリック 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.

    この例では開発証明書が使用されています。A development certificate is used in this example. 証明書が信頼できないというブラウザーの警告がバイパスされた後に、ページが安全に読み込まれます。The page loads securely after bypassing the browser's untrusted certificate warning.

    読み込まれたアプリのインデックス ページを表示するブラウザー ウィンドウ

プロキシ サーバーとロード バランサーのシナリオProxy server and load balancer scenarios

インターネットや企業ネットワークからの要求とやりとりする HTTP.sys でホストされるアプリの場合、プロキシ サーバーやロード バランサーの背後でホストするとき、追加の構成が必要になることがあります。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. 詳細については、「プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成する」を参照してください。For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

その他の技術情報Additional resources

HTTP.sys は、Windows 上でのみ動作する ASP.NET Core 用 Web サーバーです。HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP.sys は Kestrel サーバーの代替製品であり、Kestrel では提供されていない機能がいくつか用意されています。HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

重要

HTTP.sys は ASP.NET Core モジュールと互換性がなく、IIS や IIS Express で使用することはできません。HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

HTTP.sys は、次の機能をサポートします。HTTP.sys supports the following features:

  • Windows 認証Windows Authentication
  • ポート共有Port sharing
  • SNI を使用する HTTPSHTTPS with SNI
  • HTTP/2 over TLS (Windows 10 以降)HTTP/2 over TLS (Windows 10 or later)
  • 直接ファイル伝送Direct file transmission
  • 応答キャッシュResponse caching
  • WebSocket (Windows 8 以降)WebSockets (Windows 8 or later)

サポートされている Windows バージョン:Supported Windows versions:

  • Windows 7 以降Windows 7 or later
  • Windows Server 2008 R2 以降Windows Server 2008 R2 or later

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

HTTP.sys を使用するタイミングWhen to use HTTP.sys

HTTP.sys は、次のような展開に適しています。HTTP.sys is useful for deployments where:

  • IIS を使用せず、インターネットに直接サーバーを公開する必要がある。There's a need to expose the server directly to the Internet without using IIS.

    インターネットと直接通信する HTTP.sys

  • 内部の展開で、Windows 認証などの、Kestrel では使用できない機能が要求されている。An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    内部ネットワークと直接通信する HTTP.sys

HTTP.sys は、さまざまな種類の攻撃を防ぎ、フル機能の 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. IIS 自体が、HTTP.sys 上で HTTP リスナーとして実行されています。IIS itself runs as an HTTP listener on top of HTTP.sys.

HTTP/2 のサポートHTTP/2 support

Http/2 は、次の基本要件が満たされている場合に、ASP.NET Core アプリに対して有効になります。HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

Http/2 接続が確立されると、HttpRequest.ProtocolHTTP/1.1 を報告します。If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/1.1.

HTTP/2 は既定で有効になっています。HTTP/2 is enabled by default. Http/2 接続が確立されない場合、接続は http/1.1 にフォールバックします。If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. Windows の今後のリリースで、HTTP.sys で HTTP/2 を無効にする機能を含む HTTP/2 構成フラグが使用可能になる予定です。In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Kerberos を使用したカーネル モード認証Kernel mode authentication with Kerberos

HTTP.sys では、Kerberos 認証プロトコルを使用したカーネル モード認証に処理が委任されます。HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. Kerberos および HTTP.sys ではユーザー モード認証がサポートされていません。User mode authentication isn't supported with Kerberos and HTTP.sys. Active Directory から取得され、クライアントによって、ユーザーを認証するサーバーに転送される Kerberos トークン/チケットを暗号化解除するには、コンピューター アカウントを使用する必要があります。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. アプリのユーザーではなく、ホストのサービス プリンシパル名 (SPN) を登録します。Register the Service Principal Name (SPN) for the host, not the user of the app.

HTTP.sys の使用方法How to use HTTP.sys

HTTP.sys を使用するように ASP.NET Core アプリを構成するConfigure the ASP.NET Core app to use HTTP.sys

Microsoft.AspNetCore.App メタパッケージ (nuget.org) を使用する場合は、プロジェクト ファイルのパッケージ参照は必要ありません。A package reference in the project file isn't required when using the Microsoft.AspNetCore.App metapackage (nuget.org). Microsoft.AspNetCore.App メタパッケージを使用しない場合は、Microsoft.AspNetCore.Server.HttpSys にパッケージ参照を追加します。When not using the Microsoft.AspNetCore.App metapackage, add a package reference to Microsoft.AspNetCore.Server.HttpSys.

ホストを構築するときに UseHttpSys 拡張メソッドを呼び出し、必要な HttpSysOptions を指定します。Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. 次の例では、既定値にオプションを設定しています。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");
        });

HTTP.sys の追加の構成は、レジストリ設定を通じて処理されます。Additional HTTP.sys configuration is handled through registry settings.

HTTP.sys オプションHTTP.sys options

プロパティProperty 説明Description DefaultDefault
AllowSynchronousIOAllowSynchronousIO HttpContext.Request.Body および HttpContext.Response.Body に対して、入力/出力の同期を許可するかどうかを制御します。Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. true
Authentication.AllowAnonymousAuthentication.AllowAnonymous 匿名要求を許可します。Allow anonymous requests. true
Authentication.SchemesAuthentication.Schemes 許可される認証方式を指定します。Specify the allowed authentication schemes. リスナーを破棄する前ならいつでも変更できます。May be modified at any time prior to disposing the listener. 値は AuthenticationSchemes 列挙型 (BasicKerberosNegotiateNone、および NTLM) によって指定します。Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. None
EnableResponseCachingEnableResponseCaching 対象となるヘッダーを持つ応答に対して、カーネル モードのキャッシュを試行します。Attempt kernel-mode caching for responses with eligible headers. Set-CookieVary、または Pragma ヘッダーを含む応答は対象外です。The response may not include Set-Cookie, Vary, or Pragma headers. 応答は、public である Cache-Control ヘッダーと shared-max-age または 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 同時受け入れの最大数です。The maximum number of concurrent accepts. 5 ×Environment.
ProcessorCount
5 × Environment.
ProcessorCount
MaxConnections 受け入れるコンカレント接続の最大数です。The maximum number of concurrent connections to accept. 無限にするには、-1 を使用します。Use -1 for infinite. コンピューター全体のレジストリ設定を使用するには、null を使用します。Use null to use the registry's machine-wide setting. null
(コンピューター全体の(machine-wide
設定)setting)
MaxRequestBodySize MaxRequestBodySize」セクションを参照してください。See the MaxRequestBodySize section. 30000000 バイト30000000 bytes
(~28.6 MB)(~28.6 MB)
RequestQueueLimit キューに置くことができる要求の最大数。The maximum number of requests that can be queued. 10001000
ThrowWriteExceptions 応答本文の書き込みがクライアントの接続の切断によって失敗した場合、例外をスローするか、または正常に完了するかどうかを指定します。Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. false
(正常に完了する)(complete normally)
Timeouts HTTP.sys TimeoutManager 構成を公開します。これはレジストリでも構成できます。Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. 各設定に関する既定値などの詳細については、API のリンクを参照してください。Follow the API links to learn more about each setting, including default values:
UrlPrefixes HTTP.sys に登録する UrlPrefixCollection を指定します。Specify the UrlPrefixCollection to register with HTTP.sys. 最も便利なのは UrlPrefixCollection.Add です。これを使用して、コレクションにプレフィックスを追加できます。The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. これらは、リスナーを破棄する前ならいつでも変更できます。These may be modified at any time prior to disposing the listener.

MaxRequestBodySizeMaxRequestBodySize

要求本文の最大許容サイズ (バイト単位) です。The maximum allowed size of any request body in bytes. null に設定する場合、要求本文の最大サイズは制限されません。When set to null, the maximum request body size is unlimited. この制限は、アップグレード済みの接続 (常に無制限) には影響しません。This limit has no effect on upgraded connections, which are always unlimited.

1 つの IActionResult に対する ASP.NET Core MVC アプリの制限をオーバーライドする方法として、アクション メソッドに対して RequestSizeLimitAttribute 属性を使用することをお勧めします。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()

アプリが要求の読み取りを開始した後に、アプリが要求に対する制限を構成しようとすると、例外がスローされます。An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnly プロパティを使用して、MaxRequestBodySize プロパティが読み取り専用状態にあるかどうか、つまり制限を構成するには遅すぎるかどうかを示すことができます。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.

要求ごとにアプリで MaxRequestBodySize をオーバーライドする必要がある場合は、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();
}

Visual Studio を使用する場合は、アプリが IIS または IIS Express を実行するように構成されていないことを確認します。If using Visual Studio, make sure the app 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 app, manually change the selected profile, as shown in the following screen shot:

コンソール アプリのプロファイルを選択する

Windows Server を構成するConfigure Windows Server

  1. アプリに対して開くポートを決めたら、Windows ファイアウォールNew-NetFirewallRule PowerShell コマンドレットを使用して、トラフィックが 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. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  2. Azure VM に展開する場合は、ネットワーク セキュリティ グループ内でポートを開きます。When deploying to an Azure VM, open the ports in the Network Security Group. 次のコマンドとアプリの構成では、ポート 443 を使用します。In the following commands and app configuration, port 443 is used.

  3. 必要に応じて、X.509 証明書を取得してインストールします。Obtain and install X.509 certificates, if required.

    Windows の場合は、New-SelfSignedCertificate PowerShell コマンドレットを使用して自己署名証明書を作成します。On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. サポート対象外の例については、UpdateIISExpressSSLForChrome.ps1 を参照してください。For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    自己署名証明書か CA 署名証明書のいずれかをサーバーの Local Machine>Personal ストアにインストールします。Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. アプリがフレームワークに依存する展開である場合は、.NET Core、.NET Framework、またはその両方 (アプリが .NET Framework をターゲットとする .NET Core アプリである場合) をインストールします。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).

    • .NET Core: アプリで .NET Core が必要な場合は、.NET Core のダウンロードから .NET Core Runtime インストーラーを取得して実行します。.NET Core: If the app requires .NET Core, obtain and run the .NET Core Runtime installer from .NET Core Downloads. サーバーに SDK 全体をインストールしないでください。Don't install the full SDK on the server.
    • .NET Framework:アプリで .NET Framework が必要な場合は、.NET Framework のインストール ガイドを参照してください。.NET Framework: If the app requires .NET Framework, see the .NET Framework installation guide. 必要な .NET Framework をインストールします。Install the required .NET Framework. 最新の .NET Framework のインストーラーは .NET Core のダウンロード ページから入手できます。The installer for the latest .NET Framework is available from the .NET Core Downloads page.

    アプリが自己完結型の展開の場合、アプリの展開内にランタイムが含まれています。If the app is a self-contained deployment, the app includes the runtime in its deployment. サーバーにフレームワークをインストールする必要はありません。No framework installation is required on the server.

  5. アプリに URL とポートを構成します。Configure URLs and ports in the app.

    既定では、ASP.NET Core は http://localhost:5000 にバインドされます。By default, ASP.NET Core binds to http://localhost:5000. URL プレフィックスとポートを構成するには、次のオプションがあります。To configure URL prefixes and ports, options include:

    • UseUrls
    • urls コマンド ライン引数urls command-line argument
    • ASPNETCORE_URLS 環境変数ASPNETCORE_URLS environment variable
    • UrlPrefixes

    次のコード例は、サーバーのローカル IP アドレス 10.0.0.4 を使ってポート 443 上で UrlPrefixes を使う方法を示しています。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");
            });
    

    UrlPrefixes の利点は、プレフィックスの形式が正しくなかった場合、すぐにエラー メッセージが生成されることです。An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    UrlPrefixes の設定は UseUrls/urls/ASPNETCORE_URLS の設定をオーバーライドします。The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. したがって、UseUrlsurls、および ASPNETCORE_URLS 環境変数の利点は、Kestrel と 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 では、HTTP サーバー API の UrlPrefix 文字列形式が使用されます。HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    警告

    最上位のワイルドカードのバインド ( http://*:80/http://+:80 ) は使用しては いけませんTop-level wildcard bindings (http://*:80/ and http://+:80) should not be used. 最上位のワイルドカードのバインドを使用すると、アプリにセキュリティの脆弱性が生じます。Top-level wildcard bindings create app security vulnerabilities. これは、強力と脆弱の両方のワイルドカードに適用されます。This applies to both strong and weak wildcards. ワイルドカードではなく、明示的なホスト名か IP アドレスを使用してください。Use explicit host names or IP addresses rather than wildcards. 親ドメイン全体を制御する場合、サブドメインのワイルドカードのバインド (たとえば、*.mysub.com) がセキュリティ リスクになることはありません (脆弱である *.com とは対照的)。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). 詳細については、RFC 7230:セクション 5.4:ホストに関するページを参照してください。For more information, see RFC 7230: Section 5.4: Host.

  6. サーバーで URL プレフィックスを事前登録します。Preregister URL prefixes on the server.

    HTTP.sys を構成するための組み込みツールは、netsh.exe です。The built-in tool for configuring HTTP.sys is netsh.exe. netsh.exe を使用して、URL プレフィックスを予約し、X.509 証明書を割り当てることができます。netsh.exe is used to reserve URL prefixes and assign X.509 certificates. ツールを使用するには管理者特権が必要です。The tool requires administrator privileges.

    netsh.exe ツールを使用して、アプリ用に URL を登録します。Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL>:完全修飾 URL (Uniform Resource Locator)。<URL>: The fully qualified Uniform Resource Locator (URL). ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効なホスト名かローカル IP アドレスを使用してください。Use a valid hostname or local IP address. "URL の末尾にはスラッシュが必要です。 "The URL must include a trailing slash.
    • <USER>:ユーザーまたはユーザー グループの名前を指定します。<USER>: Specifies the user or user-group name.

    次の例では、サーバーのローカル IP アドレスは 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
    

    URL が登録されると、ツールから URL reservation successfully added という応答があります。When a URL is registered, the tool responds with URL reservation successfully added.

    登録済みの URL を削除するには、delete urlacl コマンドを使用します。To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  7. サーバーで X.509 証明書を登録します。Register X.509 certificates on the server.

    netsh.exe ツールを使用して、アプリ用の証明書を登録します。Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP>:バインド用のローカル IP アドレスを指定します。<IP>: Specifies the local IP address for the binding. ワイルドカードのバインドは使用しないでください。Don't use a wildcard binding. 有効な IP アドレスを使用してください。Use a valid IP address.
    • <PORT>:バインド用のポートを指定します。<PORT>: Specifies the port for the binding.
    • <THUMBPRINT>:X.509 証明書の拇印です。<THUMBPRINT>: The X.509 certificate thumbprint.
    • <GUID>:情報提供を目的として開発者によって生成された、アプリを表す GUID です。<GUID>: A developer-generated GUID to represent the app for informational purposes.

    参照用に、この GUID をパッケージ タグとしてアプリに格納します。For reference purposes, store the GUID in the app as a package tag:

    • Visual Studio:In Visual Studio:
      • ソリューション エクスプローラー内でアプリを右クリックし、 [プロパティ] をクリックして、アプリのプロジェクト プロパティを開きます。Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • [パッケージ] タブを選択します。Select the Package tab.
      • 作成した GUID を [タグ] フィールドに入力します。Enter the GUID that you created in the Tags field.
    • Visual Studio を使用しない場合:When not using Visual Studio:
      • アプリのプロジェクト ファイルを開きます。Open the app's project file.

      • 作成した GUID を指定した <PackageTags> プロパティを、新規または既存の <PropertyGroup> に追加します。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>
        

    次に例を示します。In the following example:

    • サーバーのローカル IP アドレスは 10.0.0.4 です。The local IP address of the server is 10.0.0.4.
    • オンラインのランダム GUID ジェネレーターによって、appid の値が提供されます。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}"
    

    証明書が登録されると、ツールから SSL Certificate successfully added という応答があります。When a certificate is registered, the tool responds with SSL Certificate successfully added.

    証明書の登録を削除するには、delete sslcert コマンドを使用します。To delete a certificate registration, use the delete sslcert command:

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

    以下は、netsh.exe のリファレンス ドキュメントです。Reference documentation for netsh.exe:

  8. アプリを実行します。Run the app.

    1024 より大きいポート番号で (HTTPS ではなく) HTTP を使用して localhost にバインドする場合、アプリの実行に管理者権限は必要ありません。Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. その他の構成の場合 (たとえば、ローカル IP アドレスを使用する場合やポート 443 にバインドする場合)、管理者権限でアプリを実行します。For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    サーバーのパブリック IP アドレスでアプリが応答します。The app responds at the server's public IP address. この例では、サーバーは自身のパブリック 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.

    この例では開発証明書が使用されています。A development certificate is used in this example. 証明書が信頼できないというブラウザーの警告がバイパスされた後に、ページが安全に読み込まれます。The page loads securely after bypassing the browser's untrusted certificate warning.

    読み込まれたアプリのインデックス ページを表示するブラウザー ウィンドウ

プロキシ サーバーとロード バランサーのシナリオProxy server and load balancer scenarios

インターネットや企業ネットワークからの要求とやりとりする HTTP.sys でホストされるアプリの場合、プロキシ サーバーやロード バランサーの背後でホストするとき、追加の構成が必要になることがあります。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. 詳細については、「プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成する」を参照してください。For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

その他の技術情報Additional resources