しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Core Module V2 の In-Process Hosting はアプリケーションプールで 1 つだけ利用可能

ASP.NET Core 2.2 から使えるようになった ANCM V2 の In-Process Hosting はパフォーマンス面で有利なので使っていきたいし、そもそもデフォルトは InProcess になっているので勝手に使っていると思うのですが、タイトルの通りの制約があるので注意です。

In-Process Hosting についてはこれまでも書いてきたので参考にしてください。

Azure App Service でそのまま動かす場合は 1 アプリケーションしかホストしないので問題にならないですが、App Service でも仮想アプリケーションを追加してデプロイしている場合や、他の IIS をカスタマイズ可能な環境*1などで問題となります。

ドキュメントにもひっそりと書いてはあります。

単純にアプリケーションプールを分ければ解決しますが、App Service ではアプリケーションプールは固定になるので回避できません。

ちなみに App Service の場合は設定から仮想アプリケーションを追加すると、MSDeploy で直接デプロイが可能なので割と便利です。ちなみに ZipDeploy や Run From Package では使えないです。

f:id:shiba-yan:20190314162205p:plain

2.1 まではデフォルトが OutOfProcess だったので問題は出ないですが、2.2 からは前述の通り InProcess がデフォルトなので油断するとデプロイのタイミングでアプリが起動しなくなります。

解決策はシンプルに両方とも OutOfProcess で動かすように csproj を変更するだけです。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <!--<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>-->
    <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
  </ItemGroup>

</Project>

CLR ホスティング的な制約なのか、それとも ANCM での制約なのかはっきりしないですが、OutOfProcess でもパフォーマンスは十分と言えるので問題ないでしょう。

これで解決するのですが、この制約に引っかかった時のエラーメッセージが分かりにくいです。両方を InProcess にしていた場合には以下のようなエラー画面が表示されます。

f:id:shiba-yan:20190314161553p:plain

エラーメッセージ的には .NET Core がそもそもインストールされていないみたいな感じですが、実はこの画面は静的に用意されたものなのでメッセージは常に固定です。

正しいエラー原因を探るためにはイベントログを確認するしかありません。実際に確認したところ、ちゃんと分かりやすいメッセージが出力されています。

Only one inprocess application is allowed per IIS application pool. Please assign the application '/LM/W3SVC/865786874/ROOT/sample' to a different IIS application pool.

そして片方だけ InProcess にした場合はまたメッセージが変わってきます。この画面も例によって静的に用意されたものなので、メッセージは固定です。

f:id:shiba-yan:20190314161609p:plain

こっちも同様にイベントログを確認すると、分かりやすいメッセージが出ています。

Mixed hosting model is not supported. Application '/LM/W3SVC/865786874/ROOT/sample' configured with different hostingModel value '2' other than the one of running application(s).

CLR の制約なら OutOfProcess は問題なくホスティングできそうなので、この制約は ANCM の実装によるものっぽいです。最近は 1 アプリケーションに 1 プールだと思いますが、頭に入れておくと良さそうです。

*1:Elastic Beanstalk とか