カスタム エラー ページを表示する (C#)

作成者: Scott Mitchell

ASP.NET Web アプリケーションでランタイム エラーが発生すると、ユーザーは何を確認しますか? その答えは、Web サイト <の customErrors> 構成によって異なります。 既定では、ユーザーには、ランタイム エラーが発生したことを宣言する見苦しい黄色の画面が表示されます。 このチュートリアルでは、これらの設定をカスタマイズして、サイトの外観に一致する美しく快適なカスタム エラー ページを表示する方法について説明します。

はじめに

完璧な世界では、実行時エラーはありません。 プログラマは、バグと堅牢なユーザー入力検証を備えたコードを記述し、データベース サーバーや電子メール サーバーなどの外部リソースがオフラインになることはありません。 もちろん、現実には間違いは避けられません。 .NET Frameworkのクラスは、例外をスローすることによってエラーを通知します。 たとえば、SqlConnection オブジェクトの Open メソッドを呼び出すと、接続文字列で指定されたデータベースへの接続が確立されます。 ただし、データベースがダウンしている場合、または接続文字列の資格情報が無効な場合、Open メソッドは を SqlExceptionスローします。 例外は、ブロックを使用 try/catch/finally して処理できます。 ブロック内のコードが例外を try スローした場合、コントロールは適切な catch ブロックに転送され、開発者はエラーからの回復を試みることができます。 一致する catch ブロックがない場合、または例外をスローしたコードが try ブロックにない場合、例外はブロックを try/catch/finally 検索して呼び出し履歴を percolates します。

例外が処理されずに ASP.NET ランタイムまで吹き出す場合、クラスのErrorイベントが発生し、HttpApplication構成されたエラー ページが表示されます。 既定では、ASP.NET は、黄色い 死の画面 (YSOD) と呼ばれるエラー ページを表示します。 YSOD には 2 つのバージョンがあります。1 つは例外の詳細、スタック トレース、およびアプリケーションのデバッグ開発者に役立つその他の情報を示しています ( 図 1 を参照)。もう 1 つでは、実行時エラーが発生したことを示しています ( 図 2 を参照)。

例外の詳細 YSOD は、開発者がアプリケーションをデバッグする場合に非常に役立ちますが、エンド ユーザーに YSOD を表示することは、非常に便利でプロフェッショナルではないものです。 代わりに、エンド ユーザーは、状況を説明するわかりやすい散文を使用して、サイトの外観を維持するエラー ページに移動する必要があります。 良いニュースは、このようなカスタムエラーページを作成することは非常に簡単です。 このチュートリアルでは、まず ASP を見てみましょう。NET のさまざまなエラー ページ。 次に、エラーが発生したユーザーにカスタム エラー ページを表示するように Web アプリケーションを構成する方法を示します。

3 種類のエラー ページを調べる

ASP.NET アプリケーションで未処理の例外が発生すると、次の 3 種類のエラー ページのいずれかが表示されます。

  • [例外の詳細] [死の黄色い画面] エラー ページ、
  • ランタイム エラーの [死の黄色い画面] エラー ページ、または
  • カスタム エラー ページ

開発者が最もよく知っているエラー ページは、例外の詳細 YSOD です。 既定では、このページはローカルにアクセスしているユーザーに表示されるため、開発環境でサイトをテストするときにエラーが発生したときに表示されるページです。 その名前が示すように、例外の詳細 YSOD は例外に関する詳細 (型、メッセージ、スタック トレース) を提供します。 さらに、ASP.NET ページの分離コード クラスのコードによって例外が発生し、アプリケーションがデバッグ用に構成されている場合は、例外の詳細 YSOD にもこのコード行 (およびその上と下の数行のコード) が表示されます。

図 1 は、例外の詳細 YSOD ページを示しています。 ブラウザーのアドレス ウィンドウの URL をメモします。 http://localhost:62275/Genre.aspx?ID=foo このページには、特定の Genre.aspx ジャンルの書籍レビューが一覧表示されていることを思い出してください。 クエリ文字列を GenreId 介して値 (a uniqueidentifier) を渡す必要があります。たとえば、架空のレビューを表示するための適切な URL は です Genre.aspx?ID=7683ab5d-4589-4f03-a139-1c26044d0146。 クエリ文字列 ("foo" など) を介して値uniqueidentifier 以外が渡された場合は、例外がスローされます。

Note

ダウンロードできるデモ Web アプリケーションでこのエラーを再現するには、 に直接アクセス Genre.aspx?ID=foo するか、 の [ランタイム エラーの生成] リンク Default.aspxをクリックします。

図 1 に示されている例外情報に注意してください。 ページの上部には、"文字列から uniqueidentifier への変換時に変換に失敗しました" という例外メッセージが表示されます。 例外 System.Data.SqlClient.SqlExceptionの型 () も一覧表示されます。 スタック トレースもあります。

例外に関する情報を含む例外の詳細 YSOD を示すスクリーンショット。

図 1: 例外の詳細 YSOD には、例外に関する情報が含まれています
(クリックするとフルサイズの画像が表示されます)

もう 1 つの種類の YSOD はランタイム エラー YSOD で、 図 2 に示します。 ランタイム エラー YSOD は、実行時エラーが発生したことをビジターに通知しますが、スローされた例外に関する情報は含まれません。 (ただし、ファイルを変更 Web.config してエラーの詳細を表示できるようにする手順を提供します。これは、このような YSOD がプロフェッショナルでないように見えるものの一部です)。

既定では、ランタイム エラー YSOD は、図 2: のブラウザーのアドレス バーの URL によって示されているように、 を介してhttp://www.yoursite.comリモートでアクセスするユーザーに表示されますhttp://httpruntime.web703.discountasp.net/Genre.aspx?ID=foo。 開発者がエラーの詳細を知ることに関心があるため、2 つの異なる YSOD 画面が存在しますが、そのような情報は、潜在的なセキュリティの脆弱性やその他の機密情報をサイトを訪問するユーザーに明らかになる可能性があるため、ライブ サイトに表示しないでください。

Note

フォローしていて、web ホストとして DiscountASP.NET を使用している場合は、ライブ サイトにアクセスするときにランタイム エラー YSOD が表示されないことがあります。 これは、既定 DiscountASP.NET 例外の詳細 YSOD を表示するようにサーバーが構成されているためです。 良いニュースは、セクションをファイルに追加することで、この既定の動作を <customErrors> オーバーライドできることです Web.config 。 [表示するエラー ページの構成] セクションでは、セクションを <customErrors> 詳しく調べます。

ランタイム エラー YSOD にエラーの詳細が含まれていないことを示すスクリーンショット。

図 2: ランタイム エラー YSOD にエラーの詳細が含まれていない
(クリックするとフルサイズの画像が表示されます)

3 番目の種類のエラー ページは、作成する Web ページであるカスタム エラー ページです。 カスタム エラー ページの利点は、ページの外観と共にユーザーに表示される情報を完全に制御できる点です。カスタム エラー ページでは、他のページと同じマスター ページとスタイルを使用できます。 「カスタム エラー ページの使用」セクションでは、カスタム エラー ページを作成し、ハンドルされない例外が発生した場合に表示するように構成する手順について説明します。 図 3 は 、このカスタム エラー ページのスニーク ピークを示しています。 ご覧のように、エラー ページの外観は、図 1 と図 2 に示されている黄色い死の画面の方がはるかにプロフェッショナルな外観です。

よりカスタマイズされた外観を示すカスタム エラー ページを示すスクリーンショット。

図 3: カスタム エラー ページにより、よりカスタマイズされた外観が提供される
(クリックするとフルサイズの画像が表示されます)

図 3 のブラウザーのアドレス バーを調べるのに少し時間を取ります。 アドレス バーには、カスタム エラー ページ (/ErrorPages/Oops.aspx) の URL が表示されることに注意してください。 図 1 と 2 では、エラーが発生したのと同じページに、死の黄色い画面が表示されています (Genre.aspx)。 カスタム エラー ページには、querystring パラメーターを使用してエラーが発生したページの URL が aspxerrorpath 渡されます。

表示されるエラー ページの構成

表示される 3 つのエラー ページのうち、次の 2 つの変数に基づくものがあります。

  • セクションの <customErrors> 構成情報と
  • ユーザーがローカルまたはリモートでサイトにアクセスしているかどうか。

Web.config<customErrors> セクションには、表示されるエラー ページと に影響する 2 つの属性がありますmodedefaultRedirectdefaultRedirect 属性は省略できます。 指定した場合は、カスタム エラー ページの URL を指定し、ランタイム エラー YSOD の代わりにカスタム エラー ページを表示する必要があることを示します。 属性はmode必須であり、、または RemoteOnlyの 3 つの値OnOffのいずれかを受け入れます。 これらの値の動作は次のとおりです。

  • On - ローカルかリモートかに関係なく、カスタム エラー ページまたはランタイム エラー YSOD がすべての訪問者に表示されることを示します。
  • Off - 例外の詳細 YSOD が、ローカルかリモートかに関係なく、すべての訪問者に表示されるように指定します。
  • RemoteOnly - カスタム エラー ページまたはランタイム エラー YSOD がリモート 訪問者に表示され、例外の詳細 YSOD がローカルの訪問者に表示されることを示します。

特に指定しない限り、ASP.NET モード属性を に RemoteOnly 設定し、値を指定 defaultRedirect していないかのように動作します。 つまり、既定の動作は、ランタイム エラー YSOD がリモート 訪問者に表示されている間に、例外の詳細 YSOD がローカルの訪問者に表示されるということです。 この既定の動作をオーバーライドするには、 <customErrors> Web アプリケーションの にセクションを追加します。 Web.config file.

カスタム エラー ページの使用

すべての Web アプリケーションにカスタム エラー ページが必要です。 ランタイム エラー YSOD のよりプロフェッショナルな代替手段が提供され、簡単に作成でき、カスタム エラー ページを使用するようにアプリケーションを構成するには、ほんの少しの時間がかかります。 最初の手順では、カスタム エラー ページを作成します。 という名前の新しいフォルダーを Book Reviews アプリケーションに追加し、 という ErrorPages 名前 Oops.aspxの新しい ASP.NET ページに追加しました。 ページでサイトの残りのページと同じマスター ページを使用して、同じ外観を自動的に継承するようにします。

新しい ErrorPages フォルダーと関連付けられた Oops ドットが s p x ファイルで強調表示されているスクリーンショット。

図 4: カスタム エラー ページを作成する

次に、エラー ページのコンテンツの作成に数分を費やします。 予期しないエラーが発生したことを示すメッセージと、サイトのホームページへのリンクを含む、かなり単純なカスタム エラー ページを作成しました。

カスタム エラー ページと関連するメッセージを示すスクリーンショット。

図 5: カスタム エラー ページを設計する
(クリックするとフルサイズの画像が表示されます)

エラー ページが完了したら、ランタイム エラー YSOD の代わりにカスタム エラー ページを使用するように Web アプリケーションを構成します。 これは、セクションdefaultRedirectの 属性でエラー ページ<customErrors>の URL を指定することで実現されます。 アプリケーションのファイルに次の Web.config マークアップを追加します。

<configuration>
    ...

    <system.web>
        <customErrors mode="RemoteOnly"
                      defaultRedirect="~/ErrorPages/Oops.aspx" />

        ...
    </system.web>
</configuration>

上記のマークアップは、リモートでアクセスするユーザーのカスタム エラー ページ Oops.aspx を使用しながら、ローカルにアクセスするユーザーに例外の詳細 YSOD を表示するようにアプリケーションを構成します。 この動作を確認するには、Web サイトを運用環境に展開し、ライブ サイトの Genre.aspx ページにアクセスし、無効な querystring 値を指定します。 カスタム エラー ページが表示されます ( 図 3 を参照)。

カスタム エラー ページがリモート ユーザーにのみ表示されることを確認するには、開発環境から無効なクエリ文字列を含むページにアクセス Genre.aspx します。 例外の詳細 YSOD が表示されます ( 図 1 を参照してください)。 この RemoteOnly 設定により、運用環境でサイトにアクセスするユーザーにカスタム エラー ページが表示され、ローカルで作業している開発者は例外の詳細を引き続き確認できます。

開発者への通知とエラーの詳細のログ記録

開発環境で発生するエラーは、開発者がコンピューターに座っている場合に発生しました。 例外の詳細 YSOD に例外の情報が表示され、エラーが発生したときに実行した手順を把握しています。 ただし、運用環境でエラーが発生した場合、開発者は、サイトにアクセスするエンド ユーザーがエラーの報告に時間がかかる場合を除き、エラーが発生したことを認識しません。 また、ユーザーが開発チームにエラーが発生したことを警告する方法を外れた場合でも、例外の種類、メッセージ、スタック トレースを知らなくても、エラーの原因を診断することは難しい場合があります。エラーの修正は言うまでもありません。

このような理由から、運用環境のエラーが永続的なストア (データベースなど) に記録され、開発者がこのエラーの警告を受け取るのが最も重要です。 カスタム エラー ページは、このログと通知を行うのに適した場所のように見える場合があります。 残念ながら、カスタム エラー ページはエラーの詳細にアクセスできないため、この情報をログに記録するために使用できません。 良いニュースは、エラーの詳細をインターセプトし、それらをログに記録する方法がいくつかあります。次の 3 つのチュートリアルでは、このトピックについて詳しく説明します。

異なる HTTP エラー状態に対して異なるカスタム エラー ページを使用する

ASP.NET ページによって例外がスローされ、処理されない場合、例外は ASP.NET ランタイムまで実行され、構成されたエラー ページが表示されます。 要求が ASP.NET エンジンに入っても、何らかの理由で処理できない場合 (要求されたファイルが見つからないか、ファイルの読み取りアクセス許可が無効になっている可能性があります) は、ASP.NET エンジンによって が HttpException発生します。 この例外は、ASP.NET ページから発生した例外と同様に、ランタイムまでバブルアップされ、適切なエラー ページが表示されます。

つまり、運用環境の Web アプリケーションでは、ユーザーが見つからないページを要求すると、カスタム エラー ページが表示されます。 図 6 は 、このような例を示しています。 要求は存在しないページ (NoSuchPage.aspx) HttpException 用であるため、 がスローされ、カスタム エラー ページが表示されます (querystring パラメーターの への参照 NoSuchPage.aspxaspxerrorpath 注意してください)。

A S P ドット NET ランタイムで構成されたエラー ページがどのように表示されるかを示すスクリーンショット。

図 6: ASP.NET ランタイムは、無効な要求に応答して構成されたエラー ページを表示します (フルサイズの画像を表示する をクリックします)

既定では、すべての種類のエラーによって、同じカスタム エラー ページが表示されます。 ただし、 セクション内の子要素を使用して、特定の HTTP 状態コードに対して <error> 別のカスタム エラー ページを <customErrors> 指定できます。 たとえば、HTTP 状態コードが 404 のページが見つからないエラーが発生した場合に別のエラー ページを表示するには、セクションを <customErrors> 更新して次のマークアップを含めます。

<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPages/Oops.aspx">
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
</customErrors>

この変更により、リモートでアクセスするユーザーが存在しない ASP.NET リソースを要求するたびに、 ではなくOops.aspxカスタム エラー ページに404.aspxリダイレクトされます。 図 7 に示すように、ページには、404.aspx一般的なカスタム エラー ページよりも具体的なメッセージを含めることができます。

Note

効果的な 404 エラー ページ の作成に関するガイダンスについては、「404 エラー ページ」を参照してください。

カスタム 4 O 4 エラー ページを示すスクリーンショット。

図 7: カスタム 404 エラー ページに、より対象を絞ったメッセージが表示される Oops.aspx
(クリックするとフルサイズの画像が表示されます)

ページに 404.aspx 到達するのは、ユーザーが見つからなかったページに対して要求を行ったときにのみ行われることがわかっているため、このカスタム エラー ページを拡張して、ユーザーがこの特定の種類のエラーに対処するのに役立つ機能を含めることができます。 たとえば、既知の不適切な URL を適切な URL にマップするデータベース テーブルを作成し 404.aspx 、カスタム エラー ページでそのテーブルに対してクエリを実行し、ユーザーが到達しようとしている可能性のあるページを提案することができます。

Note

カスタム エラー ページは、ASP.NET エンジンによって処理されるリソースに対して要求が行われた場合にのみ表示されます。 「IIS と ASP.NET Development Server のコア相違点」チュートリアルで説明したように、Web サーバーは特定の要求自体を処理する場合があります。 既定では、IIS Web サーバーは、ASP.NET エンジンを呼び出さずに、画像や HTML ファイルなどの静的コンテンツの要求を処理します。 したがって、ユーザーが存在しないイメージ ファイルを要求すると、ASP ではなく IIS の既定の 404 エラー メッセージが返されます。NET の構成済みエラー ページ。

まとめ

ASP.NET アプリケーションでハンドルされない例外が発生すると、ユーザーには 3 つのエラー ページ (例外の詳細の黄色い死の画面) のいずれかが表示されます。ランタイムエラー死の黄色の画面;またはカスタム エラー ページ。 表示されるエラー ページは、アプリケーションの <customErrors> 構成と、ユーザーがローカルまたはリモートでアクセスしているかどうかによって異なります。 既定の動作では、例外の詳細 YSOD がローカルの訪問者に表示され、ランタイム エラー YSOD がリモート 訪問者に表示されます。

ランタイム エラー YSOD は、サイトにアクセスするユーザーに対して、機密性の高い可能性のあるエラー情報を非表示にしますが、サイトの外観から切れ、アプリケーションがバグのある外観になります。 より適切な方法は、カスタム エラー ページを使用することです。これには、カスタム エラー ページの作成と設計、およびセクションのdefaultRedirect属性での URL の指定が<customErrors>必要です。 異なる HTTP エラーの状態に対して複数のカスタム エラー ページを作成することもできます。

カスタム エラー ページは、運用環境の Web サイトの包括的なエラー処理戦略の最初の手順です。 開発者にエラーを通知し、その詳細をログに記録することも重要な手順です。 次の 3 つのチュートリアルでは、エラー通知とログ記録の手法について説明します。

プログラミングに満足!

もっと読む

このチュートリアルで説明するトピックの詳細については、次のリソースを参照してください。