Share via


IIS 上で HTTP/3 と共に ASP.NET Core を使用する

作成者: Chris Ross

HTTP/3 は、次の IIS シナリオでの ASP.NET Core で完全にサポートされます。

  • インプロセス
  • アウトプロセス アウトプロセスでは、IIS からクライアントへの応答には HTTP/3 が使用されますが、Kestrel サーバーへのリバース プロキシ接続では HTTP/1.1 が使用されます。

インプロセス ホスティング モデルとアウトプロセス ホスティング モデルの詳細については、「IIS の ASP.NET Core モジュール (ANCM)」を参照してください。

次の要件も満たしている必要があります。

インプロセスの展開の場合、HTTP/3 接続が確立されると、HttpRequest.Protocol によって HTTP/3 が報告されます。 アウトプロセスの展開の場合、HTTP/3 接続が確立されると、HttpRequest.Protocol によって HTTP/1.1 が報告されます。それが IIS で Kestrel への要求をプロキシする方法だからです。

Alt-Svc

HTTP/3 は、alt-svc ヘッダーを介して HTTP/1.1 または HTTP/2 からのアップグレードとして検出されます。 これは、最初の要求では HTTP/3 に切り替える前に、通常 HTTP/1.1 または HTTP/2 が使用されることを意味します。 IIS によって alt-svc ヘッダーは自動的に追加されないため、アプリケーションで追加する必要があります。 次のコードは、alt-svc 応答ヘッダーを追加するミドルウェアの例を示しています。

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

上記のコードを要求パイプラインの早い段階に配置します。

IIS では、HTTP/3 が使用可能であることをクライアントに通知するために、応答ヘッダーではなく AltSvc HTTP/2 プロトコル メッセージの送信もサポートされています。 EnableAltSvc レジストリ キーに関するページを参照してください。 これには、IP アドレスではなくホスト名を使用する netsh sslcert バインドが必要です。

HTTP/3 は、次の IIS 展開シナリオでの ASP.NET Core でサポートされます。

  • インプロセス
  • アウトプロセス アウトプロセスでは、IIS からクライアントへの応答には HTTP/3 が使用されますが、Kestrel サーバーへのリバース プロキシ接続では HTTP/1.1 が使用されます。

インプロセス ホスティング モデルとアウトプロセス ホスティング モデルの詳細については、「IIS の ASP.NET Core モジュール (ANCM)」を参照してください。

次の要件も満たしている必要があります。

インプロセスの展開の場合、HTTP/3 接続が確立されると、HttpRequest.Protocol によって HTTP/3 が報告されます。 アウトプロセスの展開の場合、HTTP/3 接続が確立されると、HttpRequest.Protocol によって HTTP/1.1 が報告されます。それが IIS で Kestrel への要求をプロキシする方法だからです。

Alt-Svc

HTTP/3 は、alt-svc ヘッダーを介して HTTP/1.1 または HTTP/2 からのアップグレードとして検出されます。 これは、最初の要求では HTTP/3 に切り替える前に、通常 HTTP/1.1 または HTTP/2 が使用されることを意味します。 IIS によって alt-svc ヘッダーは自動的に追加されないため、アプリケーションで追加する必要があります。 次のコードは、alt-svc 応答ヘッダーを追加するミドルウェアの例を示しています。

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

上記のコードを要求パイプラインの早い段階に配置します。

IIS では、HTTP/3 が使用可能であることをクライアントに通知するために、応答ヘッダーではなく AltSvc HTTP/2 プロトコル メッセージの送信もサポートされています。 EnableAltSvc レジストリ キーに関するページを参照してください。 これには、IP アドレスではなくホスト名を使用する netsh sslcert バインドが必要です。