IIS で ASP.NET Web API が 404 になる原因と解決方法|IIS Express では動くのに本番でエラーになるときの対処手順

Visual Studio の IIS Express では ASP.NET Web API が正常に動くのに、同じプロジェクトを IIS 10 に配置すると「404 – ファイルまたはディレクトリが見つかりません」と表示される――このギャップでハマる開発者はとても多いです。本記事では、「なぜ IIS に載せると 404 になるのか」「どう設定すれば確実に動くのか」を、実際の URL 例(/api/values/GetDispatchData)を使いながら丁寧に解説します。

目次

IIS では動かないのに IIS Express では動く理由

まず押さえておきたいのは、同じアプリでも IIS Express と IIS 10 は別物だという点です。

  • IIS Express:Visual Studio が自動で最適な構成を用意してくれる「開発用ミニ IIS」
  • IIS 10:Windows に標準搭載された「本番用 Web サーバー」。機能やアプリケーション プール設定を自分で整える必要あり

そのため、IIS 10 にそのままソースをコピーしただけでは、必要なモジュールが有効になっていなかったり、ルーティング設定が反映されていなかったりして、結果として 404 になります。

環境URL 例挙動主な理由
Visual Studio(IIS Express)http://localhost:49822/api/values/GetDispatchData正常に JSON が返るVS が Web.config・アプリ プール・ハンドラーを自動調整している
IIS 10(本番 / ローカル IIS)http://localhost/MVCAPI/api/values/GetDispatchData404 – File or directory not found発行物が不完全 or IIS 機能不足 or ルート/プール設定ミス

つまり「IIS Express で動く = IIS でもそのまま動く」ではありません。IIS で動かすための準備をきちんと行う必要があります。

404 でも「ファイルがない」とは限らない

IIS の 404 メッセージに「File or directory not found」と書かれているため、つい「ファイルを置き忘れたのかな?」と思いがちですが、ASP.NET Web API の場合は少し事情が違います。

  • Web API の URL(/api/values/GetDispatchData)は物理ファイルではなくルーティングで解決される
  • そのルーティングを理解するのは、IIS 本体ではなくASP.NET ランタイム(Managed Pipeline)
  • ASP.NET ランタイムに処理が渡っていないと、「ファイルがない」という 404 に見える

つまり、404 の本当の原因は「ファイルがない」のではなく、ASP.NET にリクエストが届いていない(または届いてもルートにマッチしていない)ことがほとんどです。

最初にやるべきこと:発行(Publish)で正しく配置する

ソースをそのままコピペして IIS の物理パスに置くと、以下のような問題が起きがちです。

  • bin フォルダーに必要な DLL が揃っていない
  • 本来の web.config ではなく、開発用の設定ファイルを置いてしまう
  • デバッグ ビルドのまま配置され、挙動が開発環境と微妙に変わる

これらを避けるため、必ず Visual Studio の「発行(Publish)」機能を使って配置します。

フォルダー プロファイルで発行する手順

  1. Visual Studio で Web API プロジェクトを開く
  2. ソリューション エクスプローラーでプロジェクトを右クリック → [発行]
  3. 発行先として [フォルダー] を選択し、出力先フォルダー(例:C:\deploy\MVCAPI)を指定
  4. 構成を Release に設定
  5. [発行] を実行

発行が完了したら、出力フォルダーに以下のような構造ができていることを確認します。

パス存在必須説明
発行先\web.configIIS が読み込む設定ファイル。ハンドラー マッピングやルーティング設定が入る
発行先\bin\プロジェクト名の DLLWeb API コントローラ等を含むメイン DLL
発行先\bin\依存ライブラリJson.NET など NuGet パッケージの DLL 群

このフォルダーを、そのまま IIS のサイト / アプリケーションの物理パスとして指定します。ソースコードのフォルダーではなく、あくまで「発行フォルダー」を使う点が重要です。

Windows の機能で ASP.NET 4.x を有効化する

Windows 側で ASP.NET ランタイムが有効化されていないと、IIS は拡張子なし URL(/api/... など)を ASP.NET に渡せず、404 になります。

必要な機能を有効にする手順

  1. コントロール パネル → [プログラムと機能] → [Windows の機能の有効化または無効化]
  2. [インターネット インフォメーション サービス] を展開
  3. [World Wide Web サービス] → [アプリケーション開発機能] を展開
  4. 以下にチェックを入れる
    • ASP.NET 4.8
    • .NET Extensibility 4.8
    • ISAPI 拡張
    • ISAPI フィルター
  5. あわせて、[静的コンテンツ] と [既定のドキュメント] も有効にしておくと無難
機能名役割不足時の症状
ASP.NET 4.8ASP.NET 4.x アプリを動かす本体拡張子なし URL が 404.2 / 404.3 になりやすい
.NET Extensibility 4.8ASP.NET と IIS の連携を担うManaged ハンドラーが動かず 404 / 500 になる
ISAPI 拡張 / フィルター古典的な ASP.NET 連携に必要拡張子付き URL も ASP.NET に届かない

これらが有効になっていると、ExtensionlessUrlHandler-Integrated-4.0 というハンドラーが使えるようになり、/api/values のような拡張子なし URL も ASP.NET Web API に渡されるようになります。

アプリケーション プールの設定を確認する

次に確認すべきなのが、IIS の アプリケーション プールです。ここが Classic モードだったり、.NET CLR バージョンが違っていたりすると、ルーティングがまったく動きません。

推奨設定

設定項目推奨値ポイント
.NET CLR バージョンv4.0ASP.NET Web API は .NET 4.x ベースのため
マネージド パイプライン モード統合(Integrated)Classic だと Web API のルーティングが機能しないことが多い
32 ビット アプリケーションの有効化環境に合わせて true/falseアプリが x86 限定ライブラリに依存している場合のみ有効化

設定変更の手順

  1. IIS マネージャーを開く
  2. 左ペインの [アプリケーション プール] をクリック
  3. 対象のアプリケーション プール(例:MVCAPIAppPool)を右クリック → [基本設定]
  4. [.NET CLR バージョン] = v4.0 を選択
  5. [マネージド パイプライン モード] = 統合 を選択

Classic のままだと、Web API が内部で使っているルーティング(System.Web.Http)が正しく動かず、/api/... にアクセスしても ASP.NET に到達しないため、404 のままになってしまいます。

サイト / アプリケーションを正しく作成する

「既定の Web サイトに置けばいいのかな?」と何となく設定してしまうと、URL のパスがずれて 404 になることがあります。ここでは、よくある構成を例に具体的な URL と対応付けてみます。

既定の Web サイト配下にアプリケーションを作る例

  1. IIS マネージャーで [既定の Web サイト] を右クリック → [アプリケーションの追加]
  2. [エイリアス] に MVCAPI と入力
  3. [アプリケーション プール] に先ほど設定した v4.0 / 統合のプールを選択
  4. [物理パス] に「発行したフォルダー」(例:C:\deploy\MVCAPI)を指定
  5. [OK] で作成

この構成の場合、実際の URL は以下のようになります。

用途URL説明
サイト ルートhttp://localhost/MVCAPI/アプリケーション ルート。ここが表示されれば IIS と発行はほぼ成功
Web API コントローラhttp://localhost/MVCAPI/api/valuesルート設定によってはこの URL で JSON が返る
今回のメソッドhttp://localhost/MVCAPI/api/values/GetDispatchDataアクション名を含むルートの場合

よくあるミスとして、IIS Express での URL(例:http://localhost:49822/api/values/GetDispatchData)をそのままブラウザーに打ち込み、「IIS では 404 だ」と勘違いしてしまうパターンがあります。IIS に配置した場合は、必ずエイリアス(/MVCAPI など)を含めた URL でアクセスしましょう。

Web API のルーティング設定を見直す

質問のケースでは、次のような URL を叩いています。

http://localhost/MVCAPI/api/values/GetDispatchData

この URL を解決するには、アクション名を含むルート テンプレートが必要です。App_Start/WebApiConfig.cs を開き、以下のような設定になっているか確認しましょう。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 属性ルーティングを使う場合
        config.MapHttpAttributeRoutes();

        // アクション名を含むルート
        config.Routes.MapHttpRoute(
            name: "DefaultApiWithAction",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // 必要であれば、アクション名なしのルートも追加可能
        // config.Routes.MapHttpRoute(
        //     name: "DefaultApi",
        //     routeTemplate: "api/{controller}/{id}",
        //     defaults: new { id = RouteParameter.Optional }
        // );
    }
}

コントローラの例

ValuesController が次のようになっていることも確認します。

public class ValuesController : ApiController
{
    [HttpGet]
    public IHttpActionResult GetDispatchData()
    {
        var data = new
        {
            Id = 1,
            Message = "IIS からも取得できました"
        };

        return Ok(data);
    }
}
  • クラス名は ValuesController(末尾が Controller)
  • メソッド名は GetDispatchData
  • [HttpGet] 属性を付けておくと、HTTP メソッドとの対応が明示的になりトラブルが減る

なお、属性ルーティング([Route("api/values/getdispatchdata")] など)を使っている場合は、実際の URL と綴りが完全に一致しているかも確認しましょう。大文字小文字は基本的に区別されませんが、短い単語のタイプミスは見落としやすいポイントです。

動作確認のおすすめ手順

設定を一通り見直したら、次の順序で動作確認すると原因切り分けがきれいにできます。

  1. アプリケーション ルートを確認
    • URL:http://localhost/MVCAPI/
    • ここで 404 なら「発行フォルダーの指定ミス」「web.config の読み込みエラー」など、もっと手前の問題
  2. コントローラ単位で確認
    • URL:http://localhost/MVCAPI/api/values
    • JSON や配列が返るなら、Web API 自体は動いていると判断できる
  3. 目的アクションで確認
    • URL:http://localhost/MVCAPI/api/values/GetDispatchData
    • ここだけ 404 になる場合は、ルーティング定義とアクション名の不一致が濃厚

ブラウザーだけでなく、Postman や curl などのツールを使ってレスポンスの HTTP ステータスやヘッダーを確認すると、より正確に状況を把握できます。

それでも 404 のときのチェックポイント

ここまでの設定を行っても 404 が解消しない場合、IIS のログやハンドラー マッピングを確認して原因を追い込みます。

IIS ログで 404 のサブステータスを確認する

IIS のログは通常、次のフォルダーに出力されています。

C:\inetpub\logs\LogFiles\W3SVC&ltnnn&gt\

ログファイルをメモ帳などで開き、該当リクエストの行を探します。末尾付近に 404 2 のような形で ステータスコード + サブステータス が記録されています。

サブステータス意味(ざっくり)対処の方向性
404.0素の 404。ファイル/ルートが見つからないURL の間違い / ルーティング設定の見直し
404.2Web サービス拡張 / ハンドラーが無効ASP.NET 4.8 などの Windows 機能やアプリ プール設定を再確認
404.3MIME タイプ / ハンドラーの構成が不適切ハンドラー マッピングと web.config の <handlers> セクションを確認

特に 404.2 / 404.3 が出ている場合は、「アプリ自体」ではなく「IIS と ASP.NET の橋渡し部分」に問題があると考えましょう。

ハンドラー マッピングを確認する

IIS マネージャーでサイトを選択し、[機能ビュー] から [ハンドラー マッピング] を開きます。ここに以下のようなエントリが存在するか確認します。

  • ExtensionlessUrlHandler-Integrated-4.0
  • PageHandlerFactory-Integrated-4.0

これらが存在しない/無効になっている場合、拡張子なしの URL が ASP.NET に届かず、いくら Web API 側を修正しても 404 のままになります。

WebDAV の無効化

WebDAV を使っていない場合、WebDAV モジュールが Web API のルートより先にリクエストを横取りし、405 や 404 を返すことがあります。

  • サイトの [機能ビュー] → [モジュール] で、WebDAVModule を一時的に削除してみる
  • または web.config の <modules> セクションで WebDAV を除外する

WebDAV を利用していないのであれば、機能ごと無効化しておくとトラブルが減ります。

依存 DLL / ビルド設定の確認

手動コピーした場合にありがちなのが、「ローカルでは参照できていた DLL をコピーし忘れる」ケースです。発行機能を使っていれば基本的に解消されますが、念のため以下も確認しましょう。

  • bin フォルダーに、NuGet パッケージの DLL が一式揃っているか
  • ターゲット フレームワークが .NET Framework 4.x になっているか
  • デバッグ ビルドとリリース ビルドで挙動が変わらないか

DLL が不足している場合は、実行時に 500 エラーになることもありますが、ルーティング処理より手前で落ちると結果的に 404 に見えることもあるため要注意です。

背景知識:IIS Express と IIS の違いを理解する

最後に、なぜ「IIS Express では何も考えなくても動くのに、IIS 本番ではちょっとした違いで 404 になるのか」を簡単に整理しておきます。

項目IIS ExpressIIS 10(フル IIS)
用途開発用(Visual Studio 同梱)開発〜本番までのホスト
設定プロジェクト ファイルと連動して VS が自動生成手動でサイト / アプリケーション / プール / 機能を設定
モジュール構成ASP.NET Web API に必要なモジュールが最初から有効インストール時の選択やロールによっては無効
URL ベースhttp://localhost:ポート/ にアプリが直接ぶら下がるhttp://localhost/エイリアス/ など階層構造を意識する必要あり

今回のようなケースでは、「発行ではなく手動コピー」+「IIS 側の機能やプール設定の不足」 が重なり、IIS Express と IIS の差が表面化していると考えられます。

再発防止用チェックリスト

同じ落とし穴にはまり続けないよう、ASP.NET Web API を IIS に載せるときのチェックリストをまとめておきます。

カテゴリチェック項目確認結果メモ
発行Visual Studio の発行(Release / フォルダー)で配置している
発行発行フォルダー直下に web.config と bin が存在する
Windows 機能ASP.NET 4.8 / .NET Extensibility 4.8 / ISAPI 拡張 / ISAPI フィルターが有効
アプリ プール.NET CLR v4.0 / 統合モードのアプリケーション プールを使っている
サイト構成URL に正しいエイリアス(例:/MVCAPI)を含めてアクセスしている
ルーティングapi/{controller}/{action}/{id} など目的の URL に合ったルートが設定されている
ログIIS ログのサブステータス(404.2 / 404.3 等)を確認した
ハンドラーExtensionlessUrlHandler-Integrated-4.0 が有効
その他WebDAV など不要なモジュールが邪魔していない

まとめ:IIS で ASP.NET Web API の 404 を解消する最短手順

最後に、本記事で紹介した内容を「最短で試すべき手順」として整理します。

  1. Visual Studio で発行する
    • 発行先をフォルダーに設定し、Release 構成で発行
    • 発行フォルダー直下に web.config と bin があることを確認
  2. Windows の機能を有効化
    • ASP.NET 4.8 / .NET Extensibility 4.8 / ISAPI 拡張 / ISAPI フィルター にチェック
  3. アプリケーション プールを v4.0・統合モードに
    • .NET CLR バージョン = v4.0
    • マネージド パイプライン モード = 統合
  4. サイト / アプリを作成し、物理パスに発行フォルダーを指定
    • 既定の Web サイト配下に MVCAPI などのエイリアスでアプリケーションを追加
    • URL は http://localhost/MVCAPI/... になることを意識
  5. ルーティング設定を見直す
    • api/{controller}/{action}/{id} など、目的の URL に合ったルート テンプレートを設定
    • ValuesController.GetDispatchData() に [HttpGet] を付ける
  6. 順番に URL を叩いて確認
    • http://localhost/MVCAPI/
    • http://localhost/MVCAPI/api/values
    • http://localhost/MVCAPI/api/values/GetDispatchData
  7. まだダメなら IIS ログとハンドラー マッピングを確認
    • 404.2 / 404.3 なら ASP.NET 機能やハンドラー設定が怪しい
    • ExtensionlessUrlHandler-Integrated-4.0 の有無をチェック

この手順を一つずつ潰していけば、「IIS Express では動くのに IIS では 404」という典型的な問題はほぼ必ず解消できます。特に、ソースの手動コピーではなく発行を使うことと、Windows 機能とアプリケーション プールを正しく揃えることが最大のポイントです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次