2012-12-12 16 views
14

Come implementare un gestore di eccezioni globale in MVC4 in quanto sembra diverso da MVC3.MVC 4 Global Exception Filter come implementare?

Non sei sicuro di come implementare la seguente:

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

Questo ragazzo ha una buona procedura dettagliata su come fare un gestore di eccezioni globale nel MVC: http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc –

risposta

27

Purtroppo il link fornito nel COMMET di Eric Leschinski mostra solo come implementare l'interfaccia System.Web.Mvc.IExceptionFilter, e non l'interfaccia System.Web.Http.Filters.IExceptionFilter. Il primo è utilizzato nei normali controller MVC, mentre il secondo è il ApiCotrollers.

Ecco un semplice esempio di classe mi si avvicinò con per accedere eccezioni non gestite gettati nei miei 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; 
} 

E tutto quello che dovete fare per abilitare questo filtro è registrarsi nel vostro metodo 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); 
} 

Spero che questo aiuti altri googlers là fuori!

+0

Si può anche implementare applcation_Error nel file global.asax se questo funziona per te –

+1

Perché chiami Task.Factory.StartNew? è lo stesso di Task.Run? vedi http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html –

+1

Per nessun motivo particolare in realtà. Chiamare * Task.Run * equivale a * Task.Factory.StartNew * passando alcuni parametri predefiniti (http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx). Ma hai ragione, dal momento che il metodo * Task.Run * è stato introdotto in .NET Framework 4.5 è diventato il modo consigliato di pianificare un'attività per l'esecuzione. –

11

Il modo in cui ho creato un gestore di eccezioni per MVC parte di esso, ho creato una classe che implementata IExceptionFilter

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

È quindi registrarla alle Global.asax.cs all'interno protected void Application_Start()

Il metodo contiene già la linea

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

Quindi, è necessario aggiungere questa riga SOPRA si

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

Ho anche entrambi i controller MVC e API, quindi ho dovuto implementare entrambi i filtri, essenzialmente hanno fatto lo stesso, così ho preso in considerazione il fatto che siamo in una classe di servizio. –