2015-09-24 9 views
10

Ho un progetto WebAPI ASP. Sto cercando di impostare un gestore di eccezioni globale sul mio controller di base. Così ho creato un ExceptionFilterAttribute così.WebAPI Global Exception Handling

using System.Web.Http.Filters; 

public class MyExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    protected static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     var exception = actionExecutedContext.Exception; 
     log.Fatal(exception); 

     base.OnException(actionExecutedContext); 
    } 
} 

Poi ho registrato anche in /App_Start/WebApiConfig.cs

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // ... 

     // Setup Filters 
     config.Filters.Add(new MyExceptionFilterAttribute()); 
    } 
} 

Quando aggiungo gli attributi al mio controller (o base-Controller), nulla viene registrato. Che cosa sto facendo di sbagliato?

Edit: Il mio controller di gettare l'eccezione:

[HttpGet] 
public string Hello(string name) 
{ 
    if (name.Equals("error", StringComparison.OrdinalIgnoreCase)) 
    { 
     throw new HttpResponseException(HttpStatusCode.InternalServerError); 
    } 
    else 
    { 
     return name; 
    } 
} 
+0

quale tipo di eccezione vi siete persi, ci sono il numero di casi che il filtro non riesce a gestire. –

risposta

7

Come ha sottolineato @ShekharPankaj, non tutte le eccezioni sono gestite dall'attributo (o dall'approccio @ Matías fornito). Il mio codice andava bene. Ho semplicemente cambiato l'eccezione in uno ArgumentException e viene gestito.

Vedi anche questo SO-thread: catch all unhandled exceptions in ASP.NET Web Api

Per rispondere alla mia domanda, questo non è possibile!

Handling tutte le eccezioni che causano errori interni del server sembra un capacità di base Web API dovrebbe avere, così mi hanno messo in una richiesta con Microsoft per un gestore degli errori globale per l'API Web:

https://aspnetwebstack.codeplex.com/workitem/1001

Se sei d'accordo, vai a quel link e votalo!

Nel frattempo, l'eccellente articolo ASP.NET Web API Eccezione Gestione mostra alcuni modi diversi per catturare alcune diverse categorie di errori . È più complicato di quanto dovrebbe essere, e lo non cattura tutti gli errori del server interal, ma è l'approccio migliore disponibile oggi.

Aggiornamento: la gestione degli errori globali è ora implementata e disponibile nelle build notturne ! Verrà rilasciato in ASP.NET MVC v5.1. Ecco come funzionerà: https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling

5

In realtà quando si aggiunge che il filtro per il vostro HttpConfiguration vuol dire che sarà eseguito per qualsiasi azione. Cioè, non è necessario aggiungere l'intero attributo ai tuoi controller API.

Cosa può saltare il filtro? Altro filtro Il primo filtro per impostare la risposta vince e può accadere che l'azione stessa non venga mai eseguita.

In ogni caso, forse è necessario passare ad implementare un IExceptionHandler e configurarlo come segue:

config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler()); 

Questo approccio è migliore perché è un vero e proprio gestore di eccezioni ultima chance e sarà sempre chiamato indipendentemente dal comportamento dei filtri.

+0

Mi piace l'approccio ma funziona anche con metodi non asincroni? L'unico metodo che devo implementare è 'Task HandleAsync()' – Thijs

+0

@Thijs Sì, è assolutamente globale –

+0

Perché il debugger non entra nel metodo quando lancio l'eccezione. – Thijs