我无法在MVC4应用程序中使用Custom HandleErrorAttribute。

记录异常的自定义类

  public class HandleAndLogErrorAttribute : HandleErrorAttribute
  {
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    public override void OnException(ExceptionContext filterContext)
    {
      var message = string.Format("Exception     : {0}\n" +
                                  "InnerException: {1}",
                                  filterContext.Exception,
                                  filterContext.Exception.InnerException);
      Logger.Error(message);
      base.OnException(filterContext);
    }
  }

在Global.asax中,我添加了一个新的静态方法:
  public class MvcApplication : System.Web.HttpApplication
  {
    protected void Application_Start()
    {
      AreaRegistration.RegisterAllAreas();

      WebApiConfig.Register(GlobalConfiguration.Configuration);
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new HandleAndLogErrorAttribute()); //Todo: log all errors
      throw new Exception("not called???");
    }

  }

引发异常时,将加载error.chstml,但永远不会调用自定义HandlErrorAttribute中的OnException覆盖。

我怀疑没有调用Global.asax中的RegisterGlobalFilters方法,并且在那里抛出异常(请参见代码)确认了这一点。永远不会抛出该异常。

在web.config文件中,我将customErrors设置为On:
<customErrors mode="On">
</customErrors>

我在另一个解决方案中使用了相同的方法,但看不到为什么这个HandleErrorAttribute扩展无法正常工作。

最佳答案

您在RegisterGlobalFilters内创建了Global.asax方法,但是由于MVC 4的存在,全局过滤器注册是在App_Start/FilterConfig.cs的单独文件中指定的。
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters)中的Global.asax行正在调用在指定文件中定义的注册。

您可以在指定文件中添加自定义过滤器注册,也可以在RegisterGlobalFilters中手动调用您的(本地)Application_Start

关于asp.net-mvc - MVC4自定义HandleErrorAttribute,global.asax中的方法未调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17451061/

10-10 02:08