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 ファイルを下記に編集します。
<?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) | 意味 |
Auto | 0 | SetStatusフラグが設定されている場合にのみ、応答をそのままにします。 |
Replace | 1 | 既存の応答を置換します。 |
PassThrough | 2 | 既存の応答が存在する場合、応答を変更しません。 |
実行結果
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を愛用