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


44

ASP.NET MVC(この場合は3)でカスタムエラー処理を行うプロセスは、非常に軽視されているようです。ここで、ウェブ上で、さまざまなツール(エルマなど)のヘルプページのさまざまな質問と回答を読みましたが、完全な円になったのに、まだ最善の解決策がないと感じています。あなたの助けを借りて、おそらくエラー処理のための新しい標準的なアプローチを設定できます。私は物事をシンプルに保ち、これを過剰に設計したくないのです。

私の目標は次のとおりです。

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

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

404 Not Foundエラーの場合:

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

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


2
この質問をより多くの回答が得られるように、SOに移行してほしい。コード化された回答を探しています。
ショーンマクリーン

@ショーンそれは起こりそうにない。ここでの質問は、SOに関するものよりもトピックに関するものであり、受け入れられた答えがあります。通常、質問は技術的な理由で再移行されません。特定のエラー処理アプローチのコーディングに関するサポートが必要な場合は、StackOverflowで新しい質問を開いてください。そうでない場合、「コード化された回答」は広範すぎるため、有用または回答できない場合があります。最後になりましたが、モデレーターの注意を質問に引き付ける最善の方法は、質問にフラグを立てることです。それは20の上にコメント数を押すことで自動フラグをトリップしていない場合は、ここでコメントはありそう見過ごされていただろう
アダムリア

以前は約10個のコメントがありましたが、それらはすべてどこに行きましたか?
-RyanW

私はあなたの目標を満たすソリューションを見つけました。:私はSOに別の答えとしてそれを持っているstackoverflow.com/questions/6508415/...
ジェシー・ウェッブ

1
@AnnaLear私はショーンと同意します。このページはGoogleでしか見つかりませんでした。以下の回答のほぼすべてに、スタックオーバーフローへのリンクが含まれていることに注意してください。ボリュームを話す私にとっては、そもそもそこに残されるべきだったからです。
レベッカ

回答:


23

元々の質問の一部であった、私がこれを行うことになった方法を共有します。

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

  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を完全に取り除きました。HandleErrorAttributeglobal.asaxのグローバルフィルターを削除し、customErrors構成に完全に焦点を合わせResponseRewrite、302 HTTP応答コードを回避するためにWebFormリダイレクトを使用するようにシフトし、redirectmodeに変更しました。

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

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

結果:

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


5

MVC、ASP、およびお気に入りのロギング/例外処理フレームワークは、目標を非常にうまく処理できると思います。ELMAHとエンタープライズライブラリはどちらも使いやすい例外処理とログ記録を提供するため、お気に入りを選択してください。

注:わかりやすいエラーページを表示したり、質問が示唆するような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)

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

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

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

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


あなたの考えを追加してくれてありがとう。302ステータスコードは、元のASP.NETチームによるデザインの選択が不十分だと思います。私も私の答えでそれに入ります、それを行うためのいくつかのオプションがあります。MVCの世界では、customErrorsを完全に放棄し、アプリ内ですべて処理して、再利用性と制御性を向上させているようです。しかし、私はそれらを実装することに限られた成功しか収めておらず、より良く焼き付けられたように思われる多くのコードを追加していました。以下の私の回答で詳しく説明します。

OnExceptionメソッドをオーバーライドしてログに記録することを好みます。このようにして、すべてをログに記録できることがわかります。見つかったAjax呼び出しで発生したエラーでもApplication_Errorをトリガーしません
アリシア

@アリシアの完全なサンプルコード?
キケネット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.