ELMAH и API-контроллер в MVC4 не регистрируют ошибки
Использование контроллера API в MVC4, когда действие контроллера вызывает исключение, ELMAH не регистрирует ошибку.
Я думаю, проблема в том, что MVC4 устанавливает код состояния HTTP на 500 и возвращает детали исключения в объекте JSON, но он не бросает необработанное исключение, поэтому ELMAH его никогда не видит.
Как я могу получить ELMAH для записи всех ответов, где код состояния не равен 200?
Ответы
Ответ 1
Обозреватель, описанный выше, не работает. Я попытался на своем тестовом сервере и получил сообщение об ошибке ( "Данный экземпляр фильтра должен реализовать один или несколько из следующих интерфейсов фильтра: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter." )
Затем я понял, что произошло.... вы пытаетесь добавить настраиваемый фильтр в MVC Global Filter (filters.Add(new ElmahHandledErrorLoggerFilter());)
Чтобы исправить это, я разделил регистрацию фильтра в GlobalFilter и HttpFilter
FilterConfig.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterHttpFilters(HttpFilterCollection filters)
{
filters.Add(new ElmahHandledErrorLoggerFilter());
}
Global.asax
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters);
; -)
Ответ 2
ОБНОВЛЕНИЕ: этот ответ не работает в последних версиях. Используйте ответ julianox.
Ответ найден из информации здесь: http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling
Если фильтр исключений регистрируется в elmah:
public class ElmahHandledErrorLoggerFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext);
ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);
}
}
но вы также должны добавить фильтр ошибок к фильтрам GlobalConfiguration:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());
filters.Add(new ElmahHandledErrorLoggerFilter());
filters.Add(new HandleErrorAttribute());
}