MVC 4 Глобальный фильтр исключений, как реализовать?

Как реализовать глобальный обработчик исключений в MVC4, поскольку он отличается от MVC3.

Не знаете, как реализовать следующее:

public class ErrorHandlerAttribute: System.Web.Mvc.FilterAttribute, 
                                    IExceptionFilter
{
    public Task ExecuteExceptionFilterAsync(
            HttpActionExecutedContext actionExecutedContext, 
            CancellationToken cancellationToken)
    {
        throw new NotImplementedException();
    }
}

Ответы

Ответ 1

К сожалению, ссылка, содержащаяся в Eric Leschinski commet, показывает только, как реализовать интерфейс System.Web.Mvc.IExceptionFilter, а не System.Web.Http.Filters.IExceptionFilter. Первый используется в обычных MVC-контроллерах, а второй - ApiCotrollers.

Вот простой пример класса, который я придумал для регистрации необработанных исключений, брошенных в мои ApiControllers:

public class ExceptionLoggerFilter: IExceptionFilter
{
    public ExceptionLoggerFilter(Logger logger)
    {
        this.logger = logger;
    }

    public bool AllowMultiple { get { return true; } }

    public Task ExecuteExceptionFilterAsync(
            HttpActionExecutedContext actionExecutedContext,
            CancellationToken cancellationToken)
    {
        return Task.Factory.StartNew(() =>
        {
            logger.Error("web service error", actionExecutedContext.Exception);
        }, cancellationToken);
    }

    private Logger logger;
}

И все, что вам нужно сделать, чтобы включить этот фильтр, зарегистрировать его в вашем методе Global.asax Application_Start:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // allocate filter and add it to global configuration
    var exceptionLogger = new ExceptionLoggerFilter(Container.Get<Logger>());
    GlobalConfiguration.Configuration.Filters.Add(exceptionLogger);

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

Я надеюсь, что это поможет другим гуглерам!

Ответ 2

Как я создал обработчик исключений для его части MVC, я создал класс, который реализовал IExceptionFilter

public class MVCExceptionFilter : IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        Trace.TraceError(filterContext.Exception.ToString());
    }
}

Затем вы зарегистрируете его в Global.asax.cs внутри protected void Application_Start()

Метод уже содержит строку

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

Итак, вам нужно будет добавить эту строку ВЫШЕ

GlobalFilters.Filters.Add(new MVCExceptionFilter());