ASP.NET Core アプリケーションでアプリケーション独自のエラーページを表示する - ASP.NET

ASP.NET Core アプリケーションでアプリケーション独自のエラーページを表示するコードを紹介します。

概要

ASP.NET Coreアプリケーションでエラーが発生すると、デフォルトの設定では、レスポンスが何も返らないため、Webブラウザのエラー画面が表示されます。 Webアプリケーションによっては、エラーの内容を表示したり、アプリケーションのデザインに合わせたエラー画面を表示したい場合があります。
この記事では、ASP.NET Core アプリケーションで、独自のエラーページを表示するコードを紹介します。
補足
ASP.NET Webアプリケーションで独自のエラーページを表示する方法はこちらの記事を参照してください。
補足
ASP.NET Core アプリケーションで IISのエラーページを表示する方法はこちらの記事を参照してください。

プログラム例

コード

ASP.NET Coreアプリケーションを作成し、以下のコードを準備します。
Program.csは生成されたコードから変更はありません。
Startup.cs
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 ErrorPageCustom
{
  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)
    {
      services.AddRazorPages();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      app.UseStatusCodePagesWithRedirects("~/Error?c={0}");
      
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();
      app.UseEndpoints(endpoints =>
      {
        endpoints.MapRazorPages();
      });
    }
  }
}

以下はRazorPagesのコードです。
Pages\Error.cshtml
@page
@model ErrorPageCustom.Pages.ErrorModel
@{
}
<html>
<head>
</head>
<body>
  <p>エラーページです。コード:@Model.code</p>
</body>
</html>
Error.cshtm.csl
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace ErrorPageCustom.Pages
{
  public class ErrorModel : PageModel
  {
    public string code { get; set; }

    public void OnGet(string c)
    {
      code = c;
    }
  }
}

Pages\Index.cshtml
@page
@{
}
<html>
<head>
</head>
<body>
  <p>テストページです。</p>
</body>
</html>

Pages\Proc1.cshtml
@page
@model ErrorPageCustom.Pages.Proc1Model
@{
}
<html>
<head>
</head>
<body>
  <p>例外が発生するページです。</p>
</body>
</html>
Pages\Proc1.cshtm.csl
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace ErrorPageCustom.Pages
{
  public class Proc1Model : PageModel
  {
    public void OnGet()
    {
      int a = 12;
      int b = 0;
      int c = a / b;
    }
  }
}
Pages\Proc2.cshtml
@page
@model ErrorPageCustom.Pages.Proc2Model
@{
}
<html>
<head>
</head>
<body>
  <p>500レスポンスを返すページです。</p>
</body>
</html>
Proc2.cshtm.csl
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace ErrorPageCustom.Pages
{
    public class Proc2Model : PageModel
    {
        public IActionResult OnGet()
        {
          return StatusCode(500);
        }
    }
}

解説

Starup.cs のコードではRazorPagesのルーティング等を実装しています。RazorPagesのアプリケーションについてはこちらの記事を参照してください。

Configureメソッド内の UseStatusCodePagesWithRedirects() メソッドでエラーページへのリダイレクト処理を追加します。
第一引数のパラメーターにリダイレクト先のURLを指定します。また {0} のプレースホルダーが利用できます。このプレースホルダーにステータスコードが設定されます。
  app.UseStatusCodePagesWithRedirects("~/Error?c={0}");
RazorPage は今回のでもプログラムでは4つ用意します。
  • Pages\Error
  • Pages\Index
  • Pages\Proc1
  • Pages\Proc2

Pages\Error

独自のエラーを表示するRazroPageです。c パラメーターでエラーのコードを受け取り、ページにエラーコードを表示します。

Pages\Index

正常に動作するページです。アプリケーションのデフォルトドキュメントです。

Pages\Proc1

ページ内で0除算をして、例外を故意に発生させるページです。

Pages\Proc2

OnGetメソッドの戻り値でIActionResultを返す動作にしてあります。戻り値で StatusCode(500) を記述し、レスポンスコード 500 を返す動作としています。

実行結果

アプリケーションを配置し、アプリケーションルートのURLにアクセスします。下図の画面が表示されます。Index.cshtmlファイルの内容が表示されています。


アプリケーションルートのURL/Penguinにアクセスします。存在しないURLのため、404エラーが表示されます。ページの表示は下図となります。 Error.cshtml ファイルのコンテンツが表示されており、ステータスコードの404 もページ内に表示されていることが確認できます。


アプリケーションルートのURL/Proc1にアクセスします。下図の画面が表示されます。RazorPage内で例外が発生した場合は、ステータスコード500は帰りますが、 他のレスポンスは何も返らず、アプリケーションのリダイレクトも実行されないため、Webブラウザの500レスポンスのエラー画面が表示されます。


アプリケーションルートのURL/Proc2にアクセスします。Proc2では、OnGetメソッドの戻り値でStatusCode(500) を返しています。この場合は、 アプリケーションのリダイレクト処理が実行され、Error.cshtml のページが表示されます。ステータスコードも 500 が表示されています。


ASP.NET Core アプリケーションで独自のエラーページを表示する動作を実装できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-09-20
iPentec all rights reserverd.