IISでのAPI構築時にドはまりした話

IIS(Internet Information Services)上で新しいASP.NET CoreのAPIを構築している際にドはまりしたので、覚書。

結論から言うと、原因はプログラムではなくIISの「アプリケーションプール」の共有だった。

1. 状況:.envを何度見直しても直らない

IIS上には既に別のAPIが稼働しており、新しく追加するAPIも「同じ設定でいいだろう」と、既存のアプリケーションプールを使い回す形で設定を行っていた。

  • .envappsettings.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

  1. IISマネージャーを開く。
  2. 「アプリケーションプール」を右クリック > 「アプリケーションプールの追加」
  3. 新しい名前(例:MyNewApiPool)を付けて作成。
    ※ 色々調査すると .NET CLR バージョンは「マネージド コードなし」を選択しようと出てくるが、バージョンを選んでも動作した。

  4. 対象のアプリケーション(API)の「基本設定」を開き、作成した新しいプールを選択する。

これで保存したところ、あっさりと通信が成功。


まとめ

  • .envを疑う前に、まずは dotnet コマンドで単体動作するか確認。
  • IISASP.NET Coreアプリを動かすなら、アプリケーションプールの使い回しは厳禁。
  • 「1アプリ 1プール」は鉄則。

同じエラーで時間を溶かしている方の参考になれば幸いです。