web-dev-qa-db-fra.com

Application_Error dans global.asax ne détecte pas les erreurs dans WebAPI

Pour un projet sur lequel je travaille, l'une des choses que nous implémentons est quelque chose que nous avons du code pour dans certaines de mes équipes, des projets ASP.NET et MVC plus anciens - un Application_Error capteur d'exceptions qui envoie un e-mail à l'équipe de développement avec l'expérience d'exception et les détails les plus pertinents.

Voici à quoi ça ressemble:

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 problème "mineur", cependant - quand j'ai intentionnellement une partie du code, lancez une exception afin de tester ce mécanisme ...

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
}

Le JavaScript frontal intercepte immédiatement une demande HTTP 500, mais le code global.asax.cs noté ci-dessus n'est pas atteint (j'ai défini un point d'arrêt sur la première ligne d'exécution de la méthode.)

Question: De quelle manière puis-je obtenir le "vieux" Application_Error gestionnaire pour envoyer des e-mails d'erreur, afin que les développeurs de notre équipe puissent plus facilement déboguer notre application?

34
Andrew Gray

Résumé de votre logique de gestion des erreurs de Application_Error dans sa propre fonction. Créez un filtre d'exception de l'API Web .

//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.
    }
}

Les erreurs de l'API Web ne déclenchent pas l'événement Application_Error. Mais nous pouvons créer un filtre d'exception et l'enregistrer pour gérer les erreurs. Voir également Gestion globale des erreurs dans l'API Web ASP.NET 2 .

61
mason