2012-12-12 41 views
14

如何在MVC4中实现全局异常处理程序,因为它似乎与MVC3不同。MVC 4全局异常过滤器如何实现?

不知道如何实现以下内容:

public class ErrorHandlerAttribute: System.Web.Mvc.FilterAttribute, 
            IExceptionFilter 
{ 
    public Task ExecuteExceptionFilterAsync(
      HttpActionExecutedContext actionExecutedContext, 
      CancellationToken cancellationToken) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+3

这家伙就如何使在MVC一个全球性的异常处理程序相当不错演练:http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc –

回答

27

不幸的埃里克Leschinski的commet提供的链接只显示了如何实现System.Web.Mvc.IExceptionFilter接口,而不是System.Web.Http.Filters.IExceptionFilter接口。第一个用于常规MVC控制器,第二个用于ApiCotrollers

这里是我想出了登录我ApiControllers抛出未处理的异常,一个简单的类实例:

public class ExceptionLoggerFilter: IExceptionFilter 
{ 
    public ExceptionLoggerFilter(Logger logger) 
    { 
     this.logger = logger; 
    } 

    public bool AllowMultiple { get { return true; } } 

    public Task ExecuteExceptionFilterAsync(
      HttpActionExecutedContext actionExecutedContext, 
      CancellationToken cancellationToken) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      logger.Error("web service error", actionExecutedContext.Exception); 
     }, cancellationToken); 
    } 

    private Logger logger; 
} 

和所有你需要做的,以使该过滤器是在你的Global.asax Application_Start方法中注册它:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    // allocate filter and add it to global configuration 
    var exceptionLogger = new ExceptionLoggerFilter(Container.Get<Logger>()); 
    GlobalConfiguration.Configuration.Filters.Add(exceptionLogger); 

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

我希望这可以帮助其他谷歌的那里!

+0

您可能还在global.asax文件中实现applcation_Error(如果适用) –

+1

为什么要调用Task.Factory.StartNew?是否与Task.Run相同?请参阅http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html –

+1

实际上没有特殊原因。调用* Task.Run *相当于* Task.Factory.StartNew *传递一些默认参数(http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx)。但是你是对的,因为* Task.Run *方法是在.NET Framework 4.5中引入的,所以它已经成为推荐任务执行的推荐方式。 –

11

我创建了它的MVC部分异常处理的方式,我创建了一个实现个IExceptionFilter

public class MVCExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     Trace.TraceError(filterContext.Exception.ToString()); 
    } 
} 

一个类你再在Global.asax.cs中 注册它里面protected void Application_Start()

的方法已包含该行

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

因此,您需要添加此行以上

GlobalFilters.Filters.Add(new MVCExceptionFilter()); 
+0

我也有MVC和API控制器,所以我需要实现这两个过滤器,他们基本上都是这样做的,所以我将我们分解成了一个服务类。 –