Could not find 'aspnetcorev2_inprocess.dll'. Exception messageの対処法
環境
事象
NetCore3.1を対象としたASP.NetCore WebApiをIIS上に公開して、アクセスするとイベントビュワーに以下のメッセージが表示されて、IISが正常に起動しない。 WebApiからのレスポンスはHTTP500が返ってくる
Could not find 'aspnetcorev2_inprocess.dll'. Exception message: 指定されたコマンドまたはファイルが見つからなかったため、実行できませんでした。 次のような原因が考えられます: * 組み込みの dotnet コマンドのスペルが間違っている。 * .NET Core プログラムを実行しようとしたが、dotnet-.\NarumiyaMobile.WebApi.dll が存在しない。 * グローバル ツールを実行しようとしたが、プレフィックスとして dotnet が付いたこの名前の実行可能ファイルが PATH に見つからなかった。
原因
アプリケーションプールのIDが仮想フォルダに対してアクセス権を持っていない
- wwwroot以外の場所にファイルを置いていた。
- そのフォルダのセキュリティに明示的なIIS_IUSERSのアカウントを追加していた。
- アプリケーションプールのIDはデフォルトの「AppicationPoolIdentity」で設定されていた。
対応方法
アプリケーションプールのアクセス権とサイトを配置するフォルダのセキュリティが問題となっているため、考えられる対象方法はいくつかある。 1. フォルダをwwwrootに移す。wwwrootに置くとフォルダに対してIIS_IUSERS権限が付与されるのでアクセスできるようになる。 2. フォルダに対して「IIS_IUSERS」の権限を追加する。 - wwwroot上にフォルダが移動できない場合は、フォルダにIIS_IUSERSのアクセスを明示的に許可する 3. アプリケーションプールのIDをサイトを配置しているフォルダにアクセス可能なユーザーに明示的に設定する。明示的にユーザーを切りたい場合はこの方法で対応する。
終わりに
表示されるメッセージとエラーの内容が合わなすぎて、解決するまで時間がかかった。インプロセスなんて全然関係ないじゃん…。調べて良くてできたのが、SDK SDKを2.2から3.1にアップデートしようとして、サーバー上に両方インストールされている場合にも発生するようだった。弊社の秘伝でIISにサイトを立てる時にIISユーザーを明示的に作成して指定する運用だったので、はまった。IIS7.0以上では明示的なユーザーの追加は必要ないらしい。フォルダも素直にwwwroot上に置いた方がいいということを学んだ。
参考
IISのIDについて Could not find 'aspnetcorev2_inprocess.dll'. Exception message .NET ツールの使用に関する問題のトラブルシューティング