2012-04-23 70 views
1

我試圖鏈接MVC3與Elmah。一切都很好,所有的錯誤都被處理和記錄下來,但是我有問題與自定義錯誤的用戶的前端。我寫了全局過濾在web.config中MVC3 + Elmah = defaultredirect不起作用

public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     base.OnException(context); 

     var e = context.Exception; 
     if (!context.ExceptionHandled // if unhandled, will be logged anyhow 
      || RaiseErrorSignal(e)  // prefer signaling, if possible 
      || IsFiltered(context))  // filtered? 
      return; 

     LogException(e); 
    } 

    private static bool RaiseErrorSignal(Exception e) 
    { 
     var context = HttpContext.Current; 
     if (context == null) 
      return false; 
     var signal = ErrorSignal.FromContext(context); 
     if (signal == null) 
      return false; 
     signal.Raise(e, context); 
     return true; 
    } 

    private static bool IsFiltered(ExceptionContext context) 
    { 
     var config = context.HttpContext.GetSection("elmah/errorFilter") 
        as ErrorFilterConfiguration; 

     if (config == null) 
      return false; 

     var testContext = new ErrorFilterModule.AssertionHelperContext(
            context.Exception, HttpContext.Current); 

     return config.Assertion.Test(testContext); 
    } 

    private static void LogException(Exception e) 
    { 
     var context = HttpContext.Current; 
     ErrorLog.GetDefault(context).Log(new Error(e, context)); 
    } 
} 

,我註冊的過濾器在Global.asax中

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

但當引發異常,處理程序處理,但由web.config中犯規使用的defaultRedirect路徑。它在尋找webconfig

<customErrors mode="On" defaultRedirect="~/Home/NeutralError"> 
    <error statusCode="404" redirect="~/Home/NeutralErrorNotFound" /> 
</customErrors> 

任何想法鑑於〜/共享/ Error.cshtml

我? :|

回答

1

HandleError屬性作爲默認會在共享文件夾,而不是基於defaultRedirect屬性中設置上customErrors部分作品Error視圖。你可以告訴HandleError尋找一個不同的視圖名稱,但我認爲你的情況下,你想重定向到其他一些行動。我希望這將工作(未測試),

public override void OnException(ExceptionContext context) 
{ 
    base.OnException(context); 

    var e = context.Exception; 
    if (!context.ExceptionHandled // if unhandled, will be logged anyhow 
     || RaiseErrorSignal(e)  // prefer signaling, if possible 
     || IsFiltered(context))  // filtered? 
     return; 

    LogException(e); 

    // newly added 
    if (context.Exception is HttpException) 
    { 
    if(((HttpException)context.Exception).GetHttpCode() == 404) 
     context.Result = new RedirectResult("~/Home/NeutralErrorNotFound"); 
    } 
    context.Result = new RedirectResult("~/Home/NeutralError"); 
} 
+0

不幸的是,它不工作,因爲它總是通過如果條件並從OnException方法返回 – MichalGrunwald 2012-04-23 18:36:38

0

在您的OnException方法中設置您的基類視圖似乎爲我解決這個問題。

public override void OnException(ExceptionContext context) 
    { 
     base.View = "~/views/error/errorindex.cshtml"; // New code here... 
     base.OnException(context); 

     var e = context.Exception; 
     if (!context.ExceptionHandled // if unhandled, will be logged anyhow 
      || RaiseErrorSignal(e)  // prefer signaling, if possible 
      || IsFiltered(context))  // filtered? 
      return; 

     LogException(e); 
    }