2011-12-15 7 views
5

httpErrorsを使用してASP.NET MVC 3アプリケーションを作成し、ユーザーにエラーメッセージなどを表示する処理をしました。そのコードはうまく動作し、以下で重複しています。コントローラで例外が発生した場合IIS7を使用してカスタムエラーページに例外を渡すhttpErrors

<httpErrors existingResponse="Replace" defaultResponseMode="ExecuteURL" errorMode="Custom"> 
    <clear/> 
    <error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL"/> 
    <error statusCode="404" subStatusCode="-1" path="/Error/NotFound" responseMode="ExecuteURL"/> 
    <error statusCode="500" subStatusCode="-1" path="/Error/ServerError" responseMode="ExecuteURL"/> 
</httpErrors> 

は、トリガされBaseController.OnExceptionBaseControllerは、私自身の創造のクラスです)。私がその機能でしたいのは、ServerErrorアクションがそのタイプとメッセージを見て、ユーザに何を表示するかを判断できるように例外を格納することです。メソッド全体が下にコピーされます。

protected override void OnException(ExceptionContext filterContext) 
{ 
    // doesn't work 
    this.TempData["exception"] = filterContext.Exception; 

    // doesn't work 
    this.Session["exception"] = filterContext.Exception; 

    // temporary hack 
    ErrorController.RequestExceptions[this.Request.UserHostAddress] = filterContext.Exception; 
    base.OnException(filterContext); 
} 

要求(ErrorControllerが異なる名前空間にあるが、私はそれが関係ないと思う)ErrorControllerインスタンスに到着すると、nullを返しますServer.GetLastError()何らかの理由で、TempDataをが空で、セッションが空で、かつSession.IsNewSession本当です。私は問題を回避するために、アプリケーションIDを何らかの種類のストアに格納することで解決しようとしましたが、それは存在しないように見えますが、今は私が持っている最善の解決策は、それはErrorControllerがそれを取り上げるとすぐに起こります。

これは(驚くほど)機能しますが、より安全で拡張性の高いソリューションが必要です。私はなぜTempDataがクリアされたのか、Sessionがなぜ再起動されたのか不明です - エラーのためですか?それにもかかわらず、望ましい動作を得るための回避策はありますか?

P.S.可能であれば、Application_Errorのコードではなく、web.configのhttpErrorsエントリを使用することをお勧めします。これは、よりクリーンで宣言的なソリューションのようです。

P.P.S.リダイレクト(link)中にセッションオブジェクトの問題に関する記事が見つかりましたが、問題は修正されています。私が遭遇した他の多くのものは、古いシステムについてのものでしたが、私は探し続けようとしています。

+0

セッションがクリアされている理由上の任意のニュースを得るためにどのタイプHandleErrorInfoのモデルを持っています。私はまったく同じ問題を抱えています。タンク –

答えて

2

MVCには、例外を処理してカスタムビューを表示するための組み込みサポートがあります。既定では、MVCはをGlobal.asax.csファイルのRegisterGlobalFiltersメソッドに追加します。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

あなたはSharedビューフォルダにErrorという名前のビューを追加する必要があります。ビューはExceptionという名前のプロパティとしてスローされた例外

@model System.Web.Mvc.HandleErrorInfo 

@Model.Exception.Message 
+0

「httpErrors」は混乱しているのですか、それとも私が理解していない他の目的に役立つのですか? – ehdv

+0

@ehdv MVCはAsp.Netランタイムの上で実行されます。 MVCが例外をスローした場合(MVCで処理しない場合)、適切な 'httpErrors'ハンドラを使用してAsp.Netランタイムによって処理されます。 – Eranga

関連する問題