2015-02-27 16 views
17

Per un progetto su cui sto lavorando, una delle cose che stiamo implementando è qualcosa su cui abbiamo codice in alcuni dei miei vecchi progetti ASP.NET e MVC più vecchi - un Application_Error catcher di eccezioni che invia un'e-mail al team di sviluppo con l'esperienza di eccezione e i dettagli più rilevanti.Application_Error in global.asax non rileva errori in WebAPI

Ecco come appare:

Global.asax:

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    string path = "N/A"; 
    if (sender is HttpApplication) 
     path = ((HttpApplication) sender).Request.Url.PathAndQuery; 

    string args = string.Format("<b>Path:</b> {0}", path); 

    // Custom code that generates an HTML-formatted exception dump 
    string message = Email.GenerateExceptionMessage(ex, args); 

    // Custom code that sends an email to the dev team. 
    Email.SendUnexpectedErrorMessage("Some App", message); 
} 

Un problema "minore", anche se - quando ho volutamente ho una parte del codice un'eccezione al fine di testare questo meccanismo ...

public static void GetMuffinsByTopping(string topping) 
{ 
    throw new Exception("Test Exception!", new Exception("Test Inner Exception!!!")); 

    // Actual repository code is unreachable while this test code is there 
} 

il front-end JavaScript viene immediatamente intercettando una richiesta HTTP 500, ma non il codice global.asax.cs ted di cui sopra non è stato raggiunto (ho impostato un punto di interruzione sulla prima riga l'esecuzione del metodo.)

Domanda: In che modo posso ottenere il "vecchio" Application_Error gestore di inviare messaggi di posta elettronica di errore, in modo che il nostro team di gli sviluppatori possono più facilmente eseguire il debug della nostra applicazione?

+1

È possibile astrarre la logica di gestione degli errori in un metodo separato chiamato 'Application_Error', racchiudere il corpo del metodo API Web in un try/catch, quindi passare manualmente la logica di errore al metodo astratto dagli errori dell'API Web. Non sono il modo più pulito che sono sicuro, ma dovrebbe essere semplice da implementare e "funziona". Per un metodo più pulito si può guardare [Gestione delle eccezioni in API Web ASP.NET] (http://www.asp.net/web-api/overview/error-handling/exception-handling). – mason

+0

Sono d'accordo che è un buon suggerimento "basta farlo funzionare". Il motivo per cui lo chiedo è che avere un 'try/catch' in ogni metodo API è in realtà ciò che sto cercando di scappare, secondo le indicazioni del mio capo tecnico. Se tutto il resto fallisce, il nostro team può usare questo come un ripiego, però. Sarà solo un modello molto odioso. –

+1

Ho modificato il mio ultimo commento. Guarda il link che ho fornito e dai un'occhiata ai filtri delle eccezioni. Sembra un modo decente per evitare di provare/catturare tutti i corpi dei metodi API Web. – mason

risposta

38

Estrarre la logica di gestione degli errori da Application_Error nella propria funzione. Crea un Web API exception filter.

//register your filter with Web API pipeline 
GlobalConfiguration.Configuration.Filters.Add(new LogExceptionFilterAttribute()); 

//Create filter 
public class LogExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     ErrorLogService.LogError(context.Exception); 
    } 
} 

//in global.asax or global.asax.cs 
protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    ErrorLogService.LogError(ex); 
} 

//common service to be used for logging errors 
public static class ErrorLogService 
{ 
    public static void LogError(Exception ex) 
    { 
     //Email developers, call fire department, log to database etc. 
    } 
} 

Errori da API Web non attivano l'evento Application_Error. Ma possiamo creare un filtro di eccezione e registrarlo per gestire gli errori. Vedi anche Global Error Handling in ASP.NET Web API 2.

+0

Perché? Non l'ho capito È la migliore pratica? –

+3

@LeandroDeMelloFagundes L'evento Application_Error non viene generato quando l'API Web ha un'eccezione. Probabilmente hai già effettuato l'accesso in Application_Error per gestire le eccezioni ASP.NET. Quindi, inserire la logica in un servizio comune che può essere utilizzato da Application_Error o un filtro di eccezione applicato ai metodi di azione dell'API Web segue il principio DRY. Nessuna logica duplicata. – mason

+1

Grazie a @mason, leggere il link sulla tua risposta dal sito asp.net ha aiutato molto a capire cosa succede anche tu. Great aswer –

Problemi correlati