2012-12-12 6 views
14

Jak zaimplementować globalną procedurę obsługi wyjątków w MVC4, ponieważ wygląda ona inaczej niż MVC3.Globalny wyjątek MVC 4 Filtrowanie wdrażania?

Nie wiesz, jak wdrożyć następujące:

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

Ten facet ma dość dobrą instruktażu na temat sposobu dokonania całościowej obsługi wyjątku w MVC: http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc –

Odpowiedz

27

Niestety łącza w Commet Erica Leschinski pokazuje tylko, jak implementować interfejs System.Web.Mvc.IExceptionFilter, a nie interfejs System.Web.Http.Filters.IExceptionFilter. Pierwsza jest używana w zwykłych kontrolerach MVC, podczas gdy druga dotyczy ApiCotrollers.

Oto prosty przykład klasa wpadłem do logowania nieobsłużonych wyjątków zgłaszanych w moich 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; 
} 

i wszystko co musisz zrobić, aby włączyć ten filtr jest zarejestrować go w zamierzonej metodzie 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); 
} 

Mam nadzieję, że pomoże to innym użytkownikom google!

+0

Można również implementuj plik applcation_Error w pliku global.asax, jeśli to ci służy –

+1

Dlaczego wywołujesz Task.Factory.StartNew? czy to jest to samo co Task.Run? zobacz http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html –

+1

Bez konkretnego powodu. Wywołanie * Task.Run * jest równoważne * Task.Factory.StartNew * przekazywaniu niektórych domyślnych parametrów (http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx). Ale masz rację, ponieważ w systemie .NET Framework 4.5 wprowadzono metodę * Task.Run *, która stała się zalecanym sposobem planowania zadania do wykonania. –

11

Sposób, w jaki stworzył obsługi wyjątku dla MVC części, stworzyłem klasę, która realizowany IExceptionFilter

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

Następnie zarejestrować go w Global.asax.cs wewnątrz protected void Application_Start()

The metoda zawiera już linię

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

Tak więc, musisz dodać tę linię POWYŻEJ to

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

Mam również kontrolery MVC i API, więc musiałem wdrożyć oba filtry, w zasadzie robią to samo, więc uwzględniłem naszą klasę usług. –