Обработка глобальных исключений WebAPI

У меня есть проект ASPAPAPI. Я пытаюсь настроить глобальный обработчик исключений на моем базовом контролере. Поэтому я создал ExceptionFilterAttribute так.

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

Затем я также зарегистрировал его в /App_Start/WebApiConfig.cs

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

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

Когда я добавляю атрибуты к моему контроллеру (или базовому контроллеру), ничего не регистрируется. Что я делаю неправильно?

Изменить: мой контроллер бросает исключение:

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

Ответ 1

Как отмечал @ShekharPankaj, не все исключения обрабатываются атрибутом (или подходом @Matías). Мой код был в порядке. Я просто изменил исключение на ArgumentException, и он обрабатывается.

См. также этот SO-поток: поймать все необработанные исключения в ASP.NET Web Api

Чтобы ответить на мой собственный вопрос, это невозможно!

Обработка всех исключений, которые вызывают внутренние ошибки сервера, выглядит как базовые возможности Web API должны иметь, поэтому я поставил запрос с Microsoft для глобального обработчика ошибок для веб-API:

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

Если вы согласны, перейдите по этой ссылке и проголосуйте за нее!

В то же время отличная статья ASP.NET Web API Exception Обработка показывает несколько разных способов поймать несколько разных категории ошибок. Это сложнее, чем должно быть, и это не улавливает все межсерверные ошибки, но это лучший подход доступный сегодня.

Обновление. Глобальная обработка ошибок теперь реализована и доступна в Ночные сборки! Он будет выпущен в ASP.NET MVC v5.1. Вот как это будет работать: https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling

Ответ 2

Фактически, когда вы добавляете этот фильтр в свой HttpConfiguration, это означает, что он будет выполнен для любого действия. То есть вам не нужно добавлять весь атрибут к вашим контроллерам API.

Что может пропустить ваш фильтр? Другой фильтр. Первый фильтр для установки ответа выигрывает, и может случиться так, что само действие никогда не выполняется.

В любом случае, возможно, вам нужно переключиться на реализацию IExceptionHandler и настроить его следующим образом:

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

Этот подход лучше, потому что он является истинным обработчиком исключений из последней вероятности, и он будет всегда вызываться независимо от поведения фильтров.