前回は、Blazor WebAssembly App の「ホストしない(ASP.NET Core hosted にチェックを入れない)」プロジェクトをフォルダーに発行し、IIS で動くようにした。

CoreHosted今回は、「ホストされた(ASP.NET Core hosted な)」Blazor WebAssembly App をフォルダーに発行する。

プロジェクト新規作成時、テンプレートから「Blazor アプリ」を選んだ後、「新しい Blazor アプリを作成します」の画面で、左上のフレームワークを「.NET 5.0」に、テンプレートは「Blazor WebAssembly App」に、そして右側の「ASP.NET Core hosted」にチェックを入れる。

SolCore hosted にすると、作成されるソリューションの中にプロジェクトが 3 つぶら下がる。Client、Server、Shared の 3 つ。

CoreHostedWebF5 でデバッグ実行すると、Core hosted でないバージョン(以降「単体版」と呼ぶ)とほぼ同じサイトが表示される。

違いは Fetch data。単体版では所定のファイルを読み込んでいたので毎回同じ内容が表示されたが、Core hosted 版ではサーバーと通信してデータを取得する。サーバー側はランダムな数値を返してくるので、毎回表示される内容が変わる。

発行

前回の単体版発行時とほぼ同じなので、異なる部分のみを記載する。

発行するのは 3 つあるプロジェクトのうちの「Server」プロジェクト。それ以外のプロジェクトは、Server を発行すると自動的にくっついてくる。

x64公開の設定ダイアログでは、配置モードが「自己完結」なのは前回と同じだが、ターゲットランタイムは browser-wasm が選択肢にないので「win-x64」を選ぶ(32 ビット OS を使っていれば win-x86 かと思う)。

wasm じゃなくてちゃんと WebAssembly になるのか不安はあったが、あくまでもサーバー側のバイナリが win-x64 になるだけで、クライアントはちゃんと WebAssembly になるようだ。実行時の通信を見ていると、最初に blazor.webassembly.js をダウンロードさせているし、Fetch data 以外のページ切替では通信が発生しなかったので、必要時以外はクライアント側で完結しているようだ。

その他の設定は前回と同じ。

IIS の設定も前回と同じ。

これで、Core hosted 版も IIS でホストできる。

トラブルシューティング

実は最初、Core hosted 版はうまく IIS で動かなかった。IIS で動かしている Core hosted 版のページを表示しようとすると
  • HTTP エラー 500.19 - Internal Server Error
  • エラーコード 0x8007000d
  • 構成ファイル web.config
というエラーが表示された。

publish フォルダーに IIS のアクセス権限がない場合とは異なり、web.config にアクセスできないのではなく、web.config の内容が良くないという趣旨のようだった。

結果的には自動生成された web.config の内容には問題はなく、以下の対応でページが表示されるようになったが、具体的にどの対応が必要だったのかは不明。
  • 「Windows の機能の有効かまたは無効化」で、「インターネットインフォメーションサービスのホスト可能な Web コア」も念のためチェックを入れた。
  • ASP.NET Core Hosting Bundle を再インストール(IIS の有効化をした後にはやらないといけないらしい)。
  • 1 度、管理者権限で起動した Visual Studio でプロジェクトを発行した(ページ表示に成功してからは、ユーザー権限での発行でも問題なく発行できている)。
  • publish フォルダーの 1 つ上のフォルダーにもファイルがたくさんできていたので、1 つ上のフォルダーにも「IIS_IUSRS」「IUSR」にアクセス権限を付与。
  • IIS マネージャーでサイトの設定を変更する際は、いったんサイトを止めて、publish フォルダーを含む同レベルのフォルダーをすべて削除して、発行し直した。
なお、配置モードは自己完結だけでなく「フレームワーク依存」、ターゲットランタイムを「移植可能」にしても IIS で動かせた(ASP.NET Core Hosting Bundle を入れているので当然とも言えるが)。

Poolまた、アプリケーションプールの設定はデフォルト(.NET CLR 4、マネージドパイプライン統合)で問題ない。