2012-12-12 39 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控制器,所以我需要實現這兩個過濾器,他們基本上都是這樣做的,所以我將我們分解成了一個服務類。 –