IIS(Internet Information Services)上で新しいASP.NET CoreのAPIを構築している際にドはまりしたので、覚書。
結論から言うと、原因はプログラムではなくIISの「アプリケーションプール」の共有だった。
1. 状況:.envを何度見直しても直らない
IIS上には既に別のAPIが稼働しており、新しく追加するAPIも「同じ設定でいいだろう」と、既存のアプリケーションプールを使い回す形で設定を行っていた。
.envやappsettings.jsonの接続文字列は何度も確認。- 権限設定も問題なし。
- しかし、いざIIS経由でリクエストを送ると接続エラー。
2. 切り分け:ローカル実行では正常に動く
「そもそもアプリが壊れているのか?」を疑い、IISを通さずにローカルのPowerShellから直接DLLを起動して確認。
dotnet .\myApp.dll
※dll名は汎用化してます
起動後、ブラウザで直接 http://localhost:5000/api/health(ヘルスチェック用エンドポイント)を叩いてみると
- **Result:
{"status": "OK"}**
「アプリ単体なら正常に動く。ということは、原因は100% IIS側にある」と確信。そこからさらに試行錯誤…
3. デベロッパーツールに現れた「HTML」
IISの設定を色々試行錯誤している中、ブラウザのデベロッパーツール(Console)に以下のエラーメッセージが不意に出力された。
page-06ca0c00168e631e.js:1 [login] non-JSON body: <!DOCTYPE html> ... <title> HTTP Error 500.35 - ASP.NET Core does not support multiple apps in the same app pool </title>
「JSONを期待しているのにHTMLが返ってきた」というエラーらしい。
HTTP Error 500.35 - ASP.NET Core does not support multiple apps in the same app pool
4. 原因:ASP.NET Core は「1プール 1アプリ」が原則
このメッセージを調べてみたところ、IISにおいてASP.NET Coreアプリケーションは、同じアプリケーションプールで複数を同時に動かすことができないとのこと。
なぜ共有できないのか?
ASP.NET Coreは、アプリケーションプールのプロセス内で直接動作する。この仕組み上、1つのプロセス(アプリケーションプール)に対して1つのASP.NET Coreアプリしかホストできないという制約がある。
既存のAPIが既にそのプールを「占有」していたため、後から来た新しいAPIが起動できず、IISが500.35エラー(HTMLページ)を返していた。
5. 解決策:専用のアプリケーションプールを作成する
解決策としてはシンプルに「1つのアプリに対して、1つの専用プール」を用意してあげればOK
- IISマネージャーを開く。
- 「アプリケーションプール」を右クリック > 「アプリケーションプールの追加」。
新しい名前(例:
MyNewApiPool)を付けて作成。
※ 色々調査すると .NET CLR バージョンは「マネージド コードなし」を選択しようと出てくるが、バージョンを選んでも動作した。対象のアプリケーション(API)の「基本設定」を開き、作成した新しいプールを選択する。
これで保存したところ、あっさりと通信が成功。
まとめ
同じエラーで時間を溶かしている方の参考になれば幸いです。