2011-12-19 10 views
1

私のアプリケーションにカスタムエラー処理が定義されています。リソースが見つからない場合、正しい「NotFound」ビューがレンダリングされます。無制限の例外が発生すると、 'ServerError'ビューがレンダリングされます。MVC3エラー処理 - 「エラー」というビューを使用します。

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

「ビュー 『エラー』またはそのマスターが見つからなかったか、全くビュー・エンジンは、検索場所をサポートしていない次の場所が検索された:。...」私は、ロギングを行うの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); 
    } 
} 

は私がのcustomErrorsは、「オン」になっている私のweb.configファイルで:

<customErrors mode="On" defaultRedirect="blah"> 
    <error statusCode="404" redirect="dee"/> 
    <error statusCode="500" redirect="blah"/> 
</customErrors> 

そして、私は上記の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<string> messages = new Stack<string>(); 
     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); 
} 

Frameworkはでレンダリングするためにビューを定義することをどこかにあります未処理例外のイベント?

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

答えて

0

Erangaによって示唆されているように私はすでに...すべてのコントローラに自動的にフィルタを追加した行を削除していた - そのためには、フレームワークは、「エラー」表示を検索するために引き起こしていたものではありませんでした。

問題は、私のコントローラの1つの上に座っている[HandleError]属性タグが残っていることが原因です。

私のコントローラにクラス定義の先頭に[HandleError]属性が装飾されているにもかかわらず、web.configで定義されている私のカスタムエラー処理ルーチンがまだ残っていた

私はApplication_ErrorがExceptionをキャッチして、私の 'Logger'インスタンスを介してデータベースに静かにログを記録します(HandleErrorAttributeによって定義される)。 ..私のカスタムエラー処理ルーチンは正常に完了します。

3

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

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); // remove this line 
    } 
+0

Eranga:これはかなり問題ではありませんでしたが、下記のような解決策を見つけることができました - ありがとう!ありがとう! – JTech

+1

ありがとう!それは私のためだった。新しくなった人の中には、新しいテンプレートでは、これはApp_StartフォルダのFilterConfig.csにあります。 –

関連する問題