ASP.NET Core アプリケーションのエラーでIISのエラーページを返す - ASP.NET

ASP.NET Core アプリケーションのエラーでIISのエラーページを返す設定を紹介します。

概要

ASP.NET Core アプリケーションではエラー画面はアプリケーションのエラーを返すため、IISのエラーページとは違う画面が表示されます。 アプリケーション専用のエラー画面を表示する場合は、エラーのカスタム画面などを作成できますが、IISのWebサーバーのエラーページと 同じページを返したい場合があります。

ASP.NET Core アプリケーションでIISのエラーページを返すには、httpErrors タグの existingResponse 属性で Replace を指定します。
<httpErrors errorMode="Custom" existingResponse="Replace"/>

動作の確認

はじめに、ASP.NET CoreのWebアプリケーションのデフォルトのエラー表示がどうなっているか動作を確認します。
ASP.NET Coreアプリケーションを作成します。

コード

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ErrorPage
{
  public class Startup
  {
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }
      app.UseRouting();
      app.UseStaticFiles();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapGet("/", async context =>
              {
            await context.Response.WriteAsync("Hello World!");
          });
        endpoints.MapGet("/proc1", async context =>
        {
          int a = 3;
          int b = 0;
          int c = a / b;
          await context.Response.WriteAsync("例外が出ます。");
        });
      });
    }
  }
}

解説

UseStaticFiles を記述して静的ファイルを参照できる設定にしています。
wwwrootフォルダを作成し、check.html ファイルを配置しています。


また、Webアプリケーションのマッピングは、"/" のパスは、"Hello World!" の文字列を返す処理を実装しています。 "/proc1" のパスは0で除算をする処理を実行しており、例外が発生する実装をしています。

実行結果

プロジェクトを実行します。WebブラウザでアプリケーションルートのURLを表示します。 下図の画面が表示されます。"Hello World!" のメッセージが表示され、通常通りの表示です。


アプリケーションルートのディレクトリ内で、存在しないURLにアクセスします。下図の表示となり、 ページが見つからない旨のエラー画面が表示されます。


続いて、アプリケーションルートURL/chrech.htmlにアクセスします。UseStaticFilesの設定がありますので、静的ファイルを参照できます。


ファイル名を変更してみます。存在しないファイルのため、下図のページが見つからないエラー画面が表示されます。


続いてアプリケーションディレクトリ以外の存在しないURLにアクセスします。アプリケーション外の存在しないページの場合は、 下図のIISのエラーページが表示されます。


アプリケーションルートURL/proc1 URLにアクセスします。下図の画面が表示されます。500エラーが表示されます。


なお、ローカルでのデバッグ実行の場合は下図のエラー画面が表示されます。


ASP.NET Core Webアプリケーションでもページが存在しない場合には、上図のページを表示するのが今回やりたいことです。

対処法

web.config ファイルを作成し、httpErrors タグの existingResponse 属性を Replace に設定することで、IISのエラー画面を Webアプリケーションのエラー画面として表示できます。

ASP.NET Core アプリケーションでファイルを追加します。追加するファイルは、"Web 構成ファイル" です。ファイル名は、web.config とします。


追加したweb.config ファイルを下記に編集します。
web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- To customize the asp.net core module uncomment and edit the following section. 
  For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace"/>
  </system.webServer>
</configuration>

解説

ASP.NET Coreのディレクトリに配置する、web.config ファイルを編集してアプリケーションのエラーをカスタマイズします。
httpErrors errorMode="Custom" タグを記述しエラーぺージをカスタマイズします。 existingResponse="Replace" 属性を記述し、エラーページをIISのページに置換する設定とします。

existingResponse に設定できる値は次のものがあります。

existingResponse の設定値
値(int)意味
Auto0SetStatusフラグが設定されている場合にのみ、応答をそのままにします。
Replace1既存の応答を置換します。
PassThrough2既存の応答が存在する場合、応答を変更しません。

実行結果

web.configファイルを配置した状態で動作確認します。
アプリケーションルートのURLにアクセスした場合の結果です。"Hello Wprld!" のメッセージが表示されており、問題なく動作します。


アプリケーションディレクトリ内で、存在しないURLにアクセスします。下図のエラー画面が表示されます。 IISのエラーページが表示できていることが確認できます。


続いて、check.html ページにアクセスします。静的ファイルが表示できます。こちらも問題なく動作します。


URLのファイル名を変更し、存在しないファイルのURKにアクセスします。下図のエラー画面が表示されます。IISのエラーページが表示される動作になっています。


アプリケーションルートURL/proc1 URLにアクセスします。下図の画面が表示されます。IISのエラーページで500エラー画面が表示されます。


ASP.NET Core アプリケーションのエラーでIISのエラーページを返す動作に変更できました。
このページのキーワード
  • ASP.NET Core エラーページ IIS
  • ASP.NET Core エラー画面 IIS
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-09-20
iPentec all rights reserverd.