Ответ 1
Попробуйте бросить HttpResponseException в конце вашей локальной обработки. По дизайну они не попадают в фильтры исключений.
throw new HttpResponseException(context.Response);
Есть ли какой-либо способ в 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)
};
}
}
}
Попробуйте бросить HttpResponseException в конце вашей локальной обработки. По дизайну они не попадают в фильтры исключений.
throw new HttpResponseException(context.Response);
Web API 2 разработан с учетом инверсии управления. Вы рассматриваете возможность обработки исключения, а не прерывания выполнения фильтра после его обработки.
В этом смысле атрибуты, полученные из ExceptionFilterAttribute
, должны проверять, обработано ли исключение, что ваш код уже делает, так как оператор is
возвращает false для значений null
. Кроме того, после обработки исключения вы устанавливаете context.Exception
на null
, чтобы избежать дальнейшей обработки.
Чтобы добиться этого в своем коде, вам нужно заменить комментарий из MethodExceptionFilterAttribute
на context.Exception = null
, чтобы очистить исключение.
Важно отметить, что не рекомендуется регистрировать более одного глобального фильтра исключений из-за проблем с упорядочением. Для получения информации о порядке выполнения фильтров атрибутов в Web API см. следующий поток Порядок выполнения с несколькими фильтрами в веб-интерфейсе.