Application_Error in global.asax not catching errors in WebAPI

60,490

Abstract out your error handling logic from Application_Error into its own function. Create a Web API exception filter.

//register your filter with Web API pipeline
//this belongs in the Application_Start event in Global Application Handler class (global.asax)
//or some other location that runs on startup
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.
    }
}

Errors from Web API do not trigger the Application_Error event. But we can create an exception filter and register it to handle the errors. Also see Global Error Handling in ASP.NET Web API 2.

Share:
60,490
Andrew Gray
Author by

Andrew Gray

I'm a full-stack programmer versed in .NET 4.6, C#, JavaScript, and Angular 1.x. I write web apps for profit, and games for fun.

Updated on October 30, 2020

Comments

  • Andrew Gray
    Andrew Gray over 3 years

    For a project I am working on, one of the things we're implementing is something that we have code for in some of my teams older ASP.NET and MVC projects - an Application_Error exception catcher that dispatches an email to the development team with the exception experience and most relevant details.

    Here's how it looks:

    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);
    }
    

    One "minor" problem, though - when I intentionally have a part of the code throw an exception in order to test this mechanism...

    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
    }
    

    The front-end JavaScript is immediately intercepting an HTTP 500 request, but the global.asax.cs code noted above is not being reached (I set a breakpoint on the first executing line of the method.)

    Question: In what way can I get the "old" Application_Error handler to dispatch error emails, so that our team's developers can more easily debug our application?