Обработка глобальных исключений 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());
Этот подход лучше, потому что он является истинным обработчиком исключений из последней вероятности, и он будет всегда вызываться независимо от поведения фильтров.