Подтвердить что ты не робот

ELMAH и API-контроллер в MVC4 не регистрируют ошибки

Использование контроллера API в MVC4, когда действие контроллера вызывает исключение, ELMAH не регистрирует ошибку.

Я думаю, проблема в том, что MVC4 устанавливает код состояния HTTP на 500 и возвращает детали исключения в объекте JSON, но он не бросает необработанное исключение, поэтому ELMAH его никогда не видит.

Как я могу получить ELMAH для записи всех ответов, где код состояния не равен 200?

4b9b3361

Ответ 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());
    }