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

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

概要

ASP.NETアプリケーションでエラーが発生した際に、デフォルトではアプリケーションエラーのページが表示されますが、 利用者向けに詳細情報があまりない、見栄えの良いページを表示したい場合があります。 この記事では、ASP.NETアプリケーションで独自のエラーページを表示するコードを紹介します。
補足
ASP.NET Core Webアプリケーションで独自のエラーページを表示する方法はこちらの記事を参照してください。

デフォルトの動作の確認

デフォルトの状態で、エラー発生時にどのような表示をするか確認します。

コード

次のWebフォームを作成します。
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ErrorPage.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
          <p>テストページです</p>
        </div>
    </form>
</body>
</html>
Page1.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page1.aspx.cs" Inherits="ErrorPage.Page1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
          <p>0除算で例外が出るページです。</p>
        </div>
    </form>
</body>
</html>
Page1.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ErrorPage
{
  public partial class Page1 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      int a = 4;
      int b = 0;
      int c = a / b;
    }
  }
}
Page2.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Page2.aspx.cs" Inherits="ErrorPage.Page2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
          <p>Not Found になるページです。</p>
        </div>
    </form>
</body>
</html>
Page2.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


namespace ErrorPage
{
  public partial class Page2 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      throw new HttpException(404, "Not Found");
    }
  }
}

解説

Page1.aspx はページのロード時に0での除算を実行して例外が発生するコードです。
Page2.aspx は HttpException 例外を発生させます。ステータスコード 404 を発生させ、ページが見つからないエラーを生成しています。
Defaul.aspxはページの表示のみです。

実行結果

アプリケーションをサーバーに配置し、アプリケーションディレクトリのURLを開きます。Default.aspx のページが表示されます。


アプリケーションのディレクトリ内で存在しないURLにアクセスします。下図の404エラーが表示されます。IISの標準のエラー画面であることがわかります。


続いて、Page1.aspx にアクセスします。下図のエラーが表示されます。アプリケーションのエラー画面が表示されます。 ローカルでの実行ではないため、詳細なスタックトレースログやコードのどの部分で例外が発生したかの詳細な情報は表示されないです。


Page2.aspx にアクセスします。下図のエラー画面が表示されます。こちらもローカルでの実行ではないため、詳細なエラーメッセージは表示されません。


Page1.aspx, Page2.aspx ではアプリケーションのエラー画面が表示されましたが、アプリケーションの利用者にはもう少し見栄えの良い画面を見せたいです。

対処方法

Web.Config に customErrors タグを記述します。
Web.Configファイルを下記のコードに変更します。
Web.Config
<?xml version="1.0" encoding="utf-8"?>
<!--
  ASP.NET アプリケーションの構成方法の詳細については、
  https://go.microsoft.com/fwlink/?LinkId=169433 を参照してください
  mode="RemoteOnly" 
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.8" />
    <httpRuntime targetFramework="4.8" />
    <customErrors defaultRedirect="~/ErrorPages/Error.aspx" mode="On">
      <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
    </customErrors>
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
</configuration>

また、エラーページ用のaspxファイルを準備します。
ErrorPages/404.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="404.aspx.cs" Inherits="ErrorPage.ErrorPages._404" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
          <p>Not Found です。</p>
        </div>
    </form>
</body>
</html>
ErrorPages/Error.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Error.aspx.cs" Inherits="ErrorPage.ErrorPages.Error" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
          <p>エラーページです。</p>
        </div>
    </form>
</body>
</html>

解説

system.web タグ内の次のコードがエラー画面の設定です。
customErrors タグを記述します。defaultRedirect 属性にエラー画面のデフォルトのリダイレクトURLを設定します。 またmode を 'On' に設定しています。modeの設定については後述します。
customErrors タグ内の error タグでステータスコードに対応したエラーページを定義できます。今回の例では、404エラーに関しては、~/ErrorPages/404.aspx を表示し、定義されていないそれ以外のエラーはデフォルトの ~/ErrorPages/Error.aspx を表示します。
  <customErrors defaultRedirect="~/ErrorPages/Error.aspx" mode="On">
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
  </customErrors>

mode 属性の値

mode属性には次の値を設定できます。
mode属性の設定値
値(int値)~~意味
on 1 例外の詳細は表示されません。標準のエラー出力が表示されます。
off 2 例外の詳細が表示されます。
RemoteOnly 0 リモートユーザーの場合は例外の詳細が表示されません。ローカルユーザーの場合には例外の詳細が表示されます。

実行結果

アプリケーションをサーバーに配置し、アプリケーションディレクトリのURLを開きます。Default.aspx のページが表示されます。


アプリケーションのディレクトリ内で存在しないURLにアクセスします。下図の404エラーが表示されます。IISの標準のエラー画面であることがわかります。


Page1.aspx にアクセスします。下図のエラーが表示されます。アプリケーションのエラー画面が表示されます。ErrorPages/Error.aspx のページが表示される動作になります。


Page2.aspx にアクセスします。下図のエラー画面が表示されます。こちらはステータスコードが404のエラーのため、 ErrorPages/404.aspx のページが表示されます。


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