問題の概要
WebアプリケーションをInternet Information Services (IIS)にデプロイした直後のことです。ローカルの開発環境では完璧に動作していたのに、本番サイトにアクセスした瞬間に壁にぶつかります。ホームページが表示される代わりに、「500.19 Internal Server Error」が表示されるのです。これは、典型的な「自分の環境では動くのに」という悪夢のような状況です。
具体的なエラーメッセージは、通常以下のようになります。
The requested page cannot be accessed because the related configuration data for the page is invalid. (Error Code 0x8007000d)
このエラーは web.config ファイルが壊れていることを示唆するため、非常に厄介です。たとえXMLの構文が完璧に見えても、IISはそれを拒否します。通常、設定が構造的に「無効」なわけではありません。むしろ、必要なモジュールがサーバーにまだインストールされていないため、IISが特定のタグ(<aspNetCore> など)を認識できていないだけなのです。
主な原因
エラーコード 0x8007000d は「データが無効です」という意味です。IISの世界では、これはほとんどの場合、依存関係の不足を意味します。この問題が発生する主な3つの理由は以下の通りです。
- ASP.NET Core Hosting Bundleの不足: .NET 6、7、または8のアプリをデプロイしているが、サーバーに
<aspNetCore>セクションを読み取るための ASP.NET Core Module (ANCM) がインストールされていない。 - URL Rewrite Moduleの不足: 設定ファイルでSEOフレンドリーなURLやSPAルーティングのために
<rewrite>ルールを使用しているが、URL Rewrite 2.1 拡張機能がインストールされていない。 - XMLの構文エラー: 閉じタグの欠落や、Wordドキュメントから誤ってコピー&ペーストされた「スマートクオート(全角の引用符)」など、実際の構文エラーが存在する。
ステップバイステップの解決策
1. ASP.NET Core Hosting Bundleのインストール
モダンな .NET アプリケーションを実行している場合、まずこれを確認してください。IISは .NET Core アプリをネイティブで実行することはできません。Webサーバーとアプリケーションコードの架け橋となる Hosting Bundle が必要です。
- アプリケーションのバージョンを確認します。たとえば、.NET 8.0.x を使用してアプリを構築した場合は、対応するバンドルが必要です。
- 公式 .NET ダウンロードページにアクセスします。
- Windows用の Hosting Bundle をダウンロードします。この約65MBのインストーラーには、ランタイムと必要なIISサポートモジュールが含まれています。
- Windows Server上でインストーラーを実行します。
- IISの再起動: このステップは必須です。インストーラーが自動で試行しますが、手動でリセットすることで新しいモジュールが確実にロードされます。コマンドプロンプトを管理者として実行し、以下を実行します。
net stop was /y
net start w3svc
iisreset の方が高速ですが、Windows Process Activation Service (WAS) を停止する方が、すべてのワーカープロセスを完全にシャットダウンできるため、より確実です。
2. URL Rewrite Moduleのインストール
ReactやAngularなどの多くのモダンなフレームワーク(SPA)は、クライアントサイドのルーティングを処理するために web.config 内の <rewrite> セクションに依存しています。モジュールがインストールされていない状態でIISが <rewrite> タグを検出すると、即座に 0x8007000d エラーをスローします。
- 公式IISサイトから URL Rewrite Module 2.1 をダウンロードします。
- インストールを完了し、IISマネージャーを再起動します。
- 書き換えルールが
<system.webServer>タグ内に正しくネストされているか確認します。
3. web.config の XML 構文の検証
モジュールがインストールされていてもエラーが解消されない場合は、隠れた構文の問題を確認してください。小さなミスがサイト全体を停止させることがあります。
- 隠れた文字: コピー&ペースト中に、標準の引用符が「スマートクオート(曲がった引用符)」に置き換わっていないか確認してください。
- 大文字と小文字の区別: XMLは大文字と小文字を区別します。
<system.webServer>が<System.WebServer>と書かれていないか確認してください。 - エンコーディング:
web.configファイルは必ず UTF-8 エンコーディングで保存してください。
簡単なテクニックとして、web.config を Chrome などのブラウザにドラッグ&ドロップしてみてください。ブラウザに XML 解析エラーが表示された場合、IISが処理できなかった構文上のバグが見つかったことになります。
動作確認
IISのモジュールリストを確認して、インストールを確定させます。
- IISマネージャーを開きます。
- 左側の接続ペインでサーバー名をクリックします。
- 中央エリアにあるモジュールアイコンをダブルクリックします。
AspNetCoreModuleV2またはRewriteModuleを探します。- サイトを更新します。500.19エラーが消え、実際のアプリケーションコンテンツが表示されるはずです。
スムーズなデプロイのためのヒント
設定エラーは、自動デプロイ中に発生することがよくあります。GitHub ActionsやAzure DevOpsなどの CI/CD パイプラインを使用している場合、YAML トランスフォーメーションにおけるインデントのたった一つのミスが、最終的な XML 出力を破損させる可能性があります。
私はソースデータの監査に、ToolCraft の YAML to JSON converter をよく利用します。設定ロジックを別の形式に変換することで、本番サーバーに反映される前に構造的なネストのエラーを簡単に見つけることができます。
最後に、アプリケーションプール の設定を確認してください。ASP.NET Core アプリの場合、 「.NET CLR バージョン」を 「マネージド コードなし」 に設定する必要があります。Hosting Bundle がアプリを外部で実行するため、IISが古い .NET ランタイムをロードする必要がなくなり、メモリの節約とバージョン競合の防止につながります。

