IIS と ASP.NET Core を使用したアウトプロセス ホスティング

ASP.NET Core アプリは IIS ワーカー プロセスとは独立したプロセスで実行されるため、プロセス管理は ASP.NET Core モジュールによって処理されます。 モジュールでは、最初の要求が届いたときに ASP.NET Core アプリのプロセスが開始され、プロセスがシャットダウンまたはクラッシュした場合はアプリが再起動されます。 この動作は、インプロセスで実行されるアプリであり、WAS (Windows プロセス アクティブ化サービス) によって管理されるアプリと基本的に同じです。

次の図は、IIS (ASP.NET Core モジュール) とアウトプロセスでホストされるアプリとの間のリレーションシップを示しています。

アウト プロセス ホスティングのシナリオの ASP.NET Core モジュール

  1. 要求は、Web からカーネル モードの HTTP.sys ドライバーに到着します。
  2. ドライバーは、Web サイトの構成ポートで IIS への要求をルーティングします。 構成されるポートは、通常 80 (HTTP) または 443 (HTTPS) です。
  3. モジュールでは、アプリのランダムなポートで Kestrel に要求を転送します。 ランダムなポートは 80 または 443 ではありません。

ASP.NET Core モジュールは、起動時に環境変数によってポートを指定します。 UseIISIntegration 拡張機能は、http://localhost:{PORT} でリッスンするようにサーバーを構成します。 追加のチェックが実行され、モジュールから発生していない要求は拒否されます。 モジュールは HTTPS 転送をサポートしていません。 要求は HTTPS を介して IIS によって受信された場合でも HTTP を介して転送されます。

Kestrel によってモジュールから要求が取り込まれた後、その要求は ASP.NET Core ミドルウェア パイプラインに転送されます。 ミドルウェア パイプラインは要求を処理し、HttpContext インスタンスとしてアプリのロジックに渡します。 IIS 統合によって追加されたミドルウェアでは、Kestrel への要求の転送を考慮して、スキーム、リモート IP、およびパスベースが更新されます。 アプリの応答が IIS に戻され、IIS はその応答を、要求を開始した HTTP クライアントに返します。

ASP.NET Core モジュールの構成ガイダンスについては、「IIS の ASP.NET Core モジュール (ANCM)」を参照してください。

ホスティングの詳細については、「Hosting in ASP.NET Core」(ASP.NET Core でのホスティング) を参照してください。

アプリケーション構成

IISIntegration コンポーネントを有効にする

CreateHostBuilder (Program.cs) でホストを構築する場合は、CreateDefaultBuilder を呼び出して IIS 統合を有効にします。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        ...

CreateDefaultBuilder の詳細については、「CreateDefaultBuilder」を参照してください。

アウトプロセス ホスティング モデル

IIS オプションを構成するには、IISOptions 用のサービス構成を ConfigureServices に含めます。 次の例では、アプリが HttpContext.Connection.ClientCertificate を設定できません。

services.Configure<IISOptions>(options => 
{
    options.ForwardClientCertificate = false;
});
オプション Default 設定
AutomaticAuthentication true true の場合、IIS 統合ミドルウェアによって、Windows 認証で認証された HttpContext.User が設定されます。 false の場合、ミドルウェアは HttpContext.User の ID を提供するだけで、AuthenticationScheme によって明示的に要求されたときに課題に応答します。 AutomaticAuthentication を機能させるためには、IIS で Windows 認証を有効にする必要があります。 詳細については、「Windows 認証」のトピックを参照してください。
AuthenticationDisplayName null ログイン ページでユーザーに表示名が表示されるように設定します。
ForwardClientCertificate true true の場合、MS-ASPNETCORE-CLIENTCERT 要求ヘッダーが指定されていると、HttpContext.Connection.ClientCertificate が設定されます。

プロキシ サーバーとロード バランサーのシナリオ

IIS 統合ミドルウェアと ASP.NET Core モジュールは、次を転送するように構成されています。

  • スキーム (HTTP/HTTPS)。
  • 要求元のリモート IP アドレス。

IIS 統合ミドルウェアは、Forwarded Headers Middleware を構成します。

追加のプロキシ サーバーとロード バランサーの背後でホストされているアプリでは、追加の構成が必要になる場合があります。 詳細については、「プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成する」を参照してください。

アウト プロセス ホスティング モデル

アウトプロセス ホスティング用にアプリを構成するには、プロジェクト ファイル ( .csproj) で、<AspNetCoreHostingModel> プロパティの値を OutOfProcess に設定します。

<PropertyGroup>
  <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

インプロセス ホスティングは InProcess で設定され、これが既定値です。

<AspNetCoreHostingModel> の値では大文字と小文字が区別されないため、inprocessoutofprocess は有効な値となります。

IIS HTTP サーバー (IISHttpServer) の代わりに、Kestrel サーバーが使用されます。

アウトプロセスの場合は、CreateDefaultBuilder によって UseIISIntegration が呼び出され、次のことが行われます。

  • ASP.NET Core モジュールの背後で実行するときにサーバーがリッスンする、ポートとベース パスを構成します。
  • スタートアップ エラーをキャプチャするホストを構成します。

プロセス名

Process.GetCurrentProcess().ProcessName から、w3wp/iisexpress (インプロセス) または dotnet (アウト プロセス) がレポートされます。

Windows 認証などの多くのネイティブなモジュールは、アクティブなままです。 ASP.NET Core モジュールでアクティブな IIS モジュールの詳細については、「ASP.NET Core での IIS モジュール」を参照してください。

ASP.NET Core モジュールでは次のことも行えます。

  • ワーカー プロセスの環境変数を設定する
  • 起動に関する問題をトラブルシューティングするために、Stdout 出力をファイル ストレージに記録する
  • Windows 認証トークンを転送する