Настройка исключения, обрабатываемого в Web API ExceptionFilterAttribute

Есть ли какой-либо способ в ASP.NET Web API отмечать исключение, обрабатываемое в ExceptionFilterAttribute?

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

Фильтр, используемый для действия контроллера:

public class MethodExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is NotImplementedException)
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(context.Exception.Message)
            };
            // here in MVC you could set context.ExceptionHandled = true;
        }
    }
}

Глобально зарегистрированный фильтр:

public class GlobalExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is SomeOtherException)
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.SomethingElse)
            {
                Content = new StringContent(context.Exception.Message)
            };
        }
    }
}

Ответ 1

Попробуйте бросить HttpResponseException в конце вашей локальной обработки. По дизайну они не попадают в фильтры исключений.

throw new HttpResponseException(context.Response);

Ответ 2

Web API 2 разработан с учетом инверсии управления. Вы рассматриваете возможность обработки исключения, а не прерывания выполнения фильтра после его обработки.

В этом смысле атрибуты, полученные из ExceptionFilterAttribute, должны проверять, обработано ли исключение, что ваш код уже делает, так как оператор is возвращает false для значений null. Кроме того, после обработки исключения вы устанавливаете context.Exception на null, чтобы избежать дальнейшей обработки.

Чтобы добиться этого в своем коде, вам нужно заменить комментарий из MethodExceptionFilterAttribute на context.Exception = null, чтобы очистить исключение.

Важно отметить, что не рекомендуется регистрировать более одного глобального фильтра исключений из-за проблем с упорядочением. Для получения информации о порядке выполнения фильтров атрибутов в Web API см. следующий поток Порядок выполнения с несколькими фильтрами в веб-интерфейсе.