web-dev-qa-db-ja.com

ASP.NET MVC 3のカスタムエラー処理の明確なガイドラインは何ですか?

ASP.NET MVC(この場合は3)でカスタムエラー処理を実行するプロセスは、非常に無視されているようです。さまざまなツール(Elmahなど)のヘルプページで、さまざまな質問と回答をここで読みましたが、完全なサークルに入ったような気がしますが、それでも最善の解決策はありません。あなたの助けがあれば、おそらくエラー処理のための新しい標準的なアプローチを設定することができます。私は物事をシンプルに保ち、これを過度に設計しないようにしたいと思います。

これが私の目標です:

サーバーエラー/例外の場合:

  1. 開発にデバッグ情報を表示する
  2. 本番環境でわかりやすいエラーページを表示する
  3. エラーをログに記録し、本番環境の管理者にメールで送信する
  4. 500 HTTPステータスコードを返す

404 Not Foundエラーの場合:

  1. わかりやすいエラーページを表示する
  2. エラーをログに記録し、本番環境の管理者にメールで送信する
  3. 404 HTTPステータスコードを返す

ASP.NET MVCでこれらの目標を達成する方法はありますか?

44
RyanW

私がこれを行った方法を共有します。それは元の質問の一部でした。

まず、私が遭遇した問題:

  1. CustomErrorsがオン(つまり、本番環境)の場合、グローバルHandleError属性は例外を飲み込み、エラービューをレンダリングしますが、elmahはこれを認識しないため、elmahなどのアドオンツールでログを記録することはできません。あなたはそれをあなたの見解で記録することができますが、それは見解です、それは間違っているようです。グローバルHandleError属性は、MVC 3 RTM Visual Studioプロジェクトテンプレートに新しく追加されました。

  2. mVCエンドポイントのURLを含むcustomErrorsは、302ステータスコードを返します。 redirectmodeプロパティがありますが、customErrorsのmvc urlを一致させてResponseRewriteモードを使用することはできません。 ( https://stackoverflow.com/questions/781861/customerrors-does-not-work-when-setting-redirectmode-responserewrite/3770265#3770265

  3. CustomErrorsを完全に回避し、アプリ内のすべてのカスタムを処理すると、IMOが非常に複雑になります。 (これが気に入りました: https://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 、それはそうではありませんでした私たちのプロジェクトには適切ではありません)

私の解決策

MVCを完全に排除しました。 302. HTTP応答コードを回避するために、global.asaxのHandleErrorAttributeグローバルフィルターを削除し、customErrors構成に完全に焦点を当て、WebFormリダイレクトを使用するようにシフトし、redirectmodeをResponseRewriteに変更しました。 。

<customErrors mode="On" defaultRedirect="/Error.aspx" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="/NotFound.aspx" />
</customErrors>

次に、NotFound.aspx page_loadイベント、Response.StatusCodeを404に設定し、Error.aspxでコード500を設定します。

結果:

Elmahログ、わかりやすいエラーページ、およびコードビハインドに1行のコードを含むステータスコードで、両方の目標が達成されました。以前のソリューションのように "MVC方法"で実行することはしませんが、2行のコードであれば問題ありません。

23
RyanW

MVC、ASPとお気に入りのロギング/例外処理フレームワークは、目標を非常にうまく処理できると思います。ELMAHとEnterprise Libraryはどちらも使いやすい例外処理とロギングを提供するので、好きなものを選択してください。ここでは、それぞれの長所と短所については説明しません。

注:わかりやすいエラーページを表示して、質問が示唆するようにHTTP 404または500を返すことはできません。わかりやすいエラーページを返すと、ブラウザーに返されるHTTPコードは302になります。これは、わかりやすいエラーページへのリダイレクトです。

フレンドリーエラーページ

しばらくの間ASP.netの一部であった古き良きweb.config設定によって目標を達成できるようです。開発中にデバッグ情報を表示し、本番環境でわかりやすいページを表示することについて言及しました。これには、web.configのカスタムエラーセクションを使用できます(CustomErrors = "Off"に設定して、デバッグ情報を表示します)。これを読んでいない場合でも、CustomErrors属性に精通していると想定します。

http://msdn.Microsoft.com/en-us/library/h0hfz6fc.aspx

表示するエラービューをより細かく制御する必要がある場合は、MVCのHandleError属性を使用します。このようにして、アクション/コントローラーごとに異なるエラービューを選択できます。

http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx

例外ロギング

すべての例外に同じ方法で応答したいようです(「エラーをログに記録して、本番環境の管理者にメールで送信してください」)。これが事実である場合、あなたの最も簡単なオプションはにコードを追加することです

Application_Error(オブジェクト送信者、EventArgs e)

あなたのglobal.asaxで。これは、選択したロギングフレームワークに渡すことができる場所です。

例外のロギング/処理をさらに制御したい場合は、HandleErrorAttributeをサブクラス化してオーバーライドできます。

OnException(System.Web.Mvc.ExceptionContext filterContext)

これは、選択したロギングフレームワークに渡すことができるもう1つの場所です。

https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror

これにより、上記のApplication_Error手法よりも多くの制御が可能になります。

一般に、MVCでは、エラーの処理方法を細かく制御できます。このコントロールが必要ない場合は、web.configでエラーページを定義するなど、ASP.netの方法を使用できます。

5
nixon