Application_Error в global.asax не обнаруживает ошибок в WebAPI

Для проекта, над которым я работаю, одна из вещей, которые мы внедряем, - это то, что у нас есть код для некоторых из моих старых проектов ASP.NET и MVC - это утилита исключения Application_Error, которая отправляет электронное письмо команда разработчиков с опытом исключения и наиболее актуальными деталями.

Вот как это выглядит:

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

Одна "незначительная" проблема, хотя - когда я намеренно имею часть кода, выставляю исключение, чтобы проверить этот механизм...

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
}

Внешний интерфейс JavaScript немедленно перехватывает запрос HTTP 500, но указанный выше код global.asax.cs не достигается (я установил точку останова на первой исполняющей строке метода.)

Вопрос:. Каким образом я могу обработать "старый" Application_Error для отправки писем с ошибками, чтобы разработчики нашей команды могли легче отлаживать наше приложение?

Ответ 1

Изложите свою логику обработки ошибок с Application_Error в ее собственную функцию. Создайте фильтр исключений веб-API.

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

Ошибки из Web API не запускают событие Application_Error. Но мы можем создать фильтр исключений и зарегистрировать его для обработки ошибок. Также см. Глобальная обработка ошибок в ASP.NET Web API 2.