MVC3エラー処理 - 「エラー」と呼ばれるビューの使用を主張

私は自分のアプリケーションのために定義されたカスタムエラーハンドリングを持っています。リソースが見つからない場合、正しい 'NotFound'ビューがレンダリングされます。無制限の例外が発生すると、 'ServerError'ビューがレンダリングされます。

私が直面している問題は、私のアプリケーションが 'エラー'というビューを見つけようとしているのに、見つからないということです。私のカスタムエラー処理ルーチンでこの例外がスローされます。

"ビュー"エラー "またはそのマスタが見つかりませんでしたまたはビューエンジンが検索された場所をサポートしていません。次の場所が検索されました:

私はすべての未処理の例外のロギングを行うApplication_Errorイベントハンドラを持っています:

protected void Application_Error(Object sender, EventArgs e)
{
    Exception lastEx = Server.GetLastError();

   //Attempt to Log the error
    try
    {
        Utils.Logger.Error(lastEx);
    }
    catch (Exception loggingEx)
    {
       //Try and write the original ex to the Trace
        Utils.TryTrace(lastEx.Message);

       //Try and write the logging exception to the Trace
        Utils.TryTrace(loggingEx.Message);
    }
}

私はweb.configでcustomErrorsを 'On'にしています:


    
    

そして、上記のweb.configで定義されたリダイレクトに対応するGlobal.asax.csのRegisterRoutesメソッドで定義されたルートを持っています:

routes.MapRoute(
    "Error - 404",
    "dee",
    new { controller = "Error", action = "NotFound" }
    );

routes.MapRoute(
    "ServerError",//When this route is matched we want minimal error info displayed
    "blah",
    new { controller = "Error", action = "ServerError" }
    );

私はOnActionExecutedルーチンを含むBaseControllerを持っています:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Logger.Info(String.Format(Constants.LOG_ACTION_EXECUTED, filterContext.Controller.ToString(), filterContext.ActionDescriptor.ActionName));
   //Log any exceptions
    if (filterContext.Exception != null)
    {
        Stack messages = new Stack();
        Exception current = filterContext.Exception;
        messages.Push(current.Message);
        while (current.InnerException != null)
        {
            messages.Push(current.InnerException.Message);                    
            current = current.InnerException;
        }
        StringBuilder result = new StringBuilder();
        while (messages.Count != 0)
        {
            result.Append(messages.Pop());
            string nextline = messages.Count > 0 ? "OUTER EXCEPTION " + messages.Count + ": " : "";
            result.Append(Environment.NewLine);
        }
        Logger.Error(result.ToString());
    }
    base.OnActionExecuted(filterContext);
}

フレームワークが未処理の例外が発生した場合にどのビューをレンダリングするかをフレームワークが定義しているところが他にありますか?

私のカスタムエラー処理ルーチンは、フレームワークがもはや 'エラー'ビューを見つけることを期待しないようにする最後のステップを欠いていますか?

1

2 答え

Global.asax.cs ファイルの HandleErrorAttribute ハンドラを削除する必要があります。この属性は、ビューを Error として設定します。 MVCランタイムは例外を処理せず、例外は customErrors セクションを使用してページを表示するAsp.Netランタイムに伝播します。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());//remove this line
    }
3
追加された
ありがとう!それは私のためだった。新しくなった人の中には、新しいテンプレートでは、これはApp_StartフォルダのFilterConfig.csにあります。
追加された 著者 Nicholas Petersen,
Eranga:これはかなり問題ではありませんでしたが、私には以下のような解決策を見つけることができました - ありがとう!
追加された 著者 JTech,

私はすでにErangaが提案しているように、フィルタを自動的にすべてのコントローラに追加した行を削除しました。つまり、フレームワークが「エラー」ビューを検索する原因とはならなかったのです。

私が経験していた問題は、私のコントローラの1つの上に座っている[HandleError]属性タグが残っているために発生していました。

したがって、私のコントローラにクラス定義の先頭に[HandleError]属性が装飾されているにもかかわらず、web.configで定義されている私のカスタムエラー処理ルーチンがまだ呼び出されていました。必要なビューを正しくレンダリングする...

(HandleErrorAttributeで定義された)フレームワークエラー処理が失敗し、私のApplication_ErrorがExceptionを捕捉し、私のLoggerインスタンスを介してデータベースに静かにログを記録します。

0
追加された