2012-04-23 69 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); 
    }