【问题标题】:MVC3 + Elmah = defaultredirect in web.config doesn't workWeb.config 中的 MVC3 + Elmah = defaultredirect 不起作用
【发布时间】:2012-04-23 15:47:50
【问题描述】:

我正在尝试将 MVC3 与 Elmah 链接。一切正常,所有错误都得到处理和记录,但是对于有自定义错误的用户,我遇到了前端问题。我写了全局过滤器

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 的默认重定向路径。它在 ~/Shared/Error.cshtml 中查看视图

我在 webconfig 中

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

有什么想法吗? : |

【问题讨论】:

    标签: asp.net-mvc-3 elmah


    【解决方案1】:

    默认情况下,HandleError 属性在共享文件夹中查找 Error 视图,并且不适用于在 customErrors 部分设置的 defaultRedirect 属性。您可以告诉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");
    }
    

    【讨论】:

    • 不幸的是,它不起作用,因为它总是通过 if 条件并从 OnException 方法返回
    【解决方案2】:

    在 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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2011-11-08
      • 2016-08-24
      • 1970-01-01
      • 2010-11-15
      • 2014-02-11
      相关资源
      最近更新 更多