Как добавить глобальные фильтры ASPI Web Api?

Я создал фильтр Web Api (используя System.Web.Http.Filters.ActionFilterAttribute), но я не могу заставить его работать внутри ASP.Net MVC 4. Я попытался добавить его к методу RegisterGlobalFilters(), но это не сработало.

Итак, если вы используете Web Api, размещенную в ASP.Net MVC, как один регистрирует фильтры?

Ответ 1

Следующий код в моем Global.asax работает для меня:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
  filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

Ответ 2

обратите внимание, что этот ответ выполняется до MVC 5/Web API 2

Краткий ответ: Фильтры MVC и Web API не являются перекрестно совместимыми, и если вы хотите зарегистрировать их по всему миру, вы должны использовать соответствующие классы конфигурации для каждого.

Длинный ответ: ASP.NET MVC и веб-API предназначены специально для работы аналогичным образом, но на самом деле это разные существа.

Web API живет в пространстве имен System.Web.Http, тогда как MVC живет под пространством имен System.Web.Mvc. Они будут счастливо жить бок о бок, но один не содержит другого, и, несмотря на сходство в модели программирования, базовые реализации различны. Так же, как контроллеры MVC и контроллеры Web API наследуют разные классы базового контроллера (MVC просто называется Controller, а Web API называется ApiController). Фильтры MVC и фильтры Web API наследуются от разных классов FilterAttribute (оба имеют одинаковое имя в этот случай, но являются отдельными классами, которые живут в их соответствующих пространствах имен).

Глобальные фильтры Web API регистрируются через объект HttpConfiguration, доступный вам в методе Register WebApiConfig.cs, если вы используете шаблон проекта с WebActivator:

public static void Register(HttpConfiguration config)
{
    //stuff before
    config.Filters.Add(new MyWebApiFilter());
    //stuff after
}

или иначе в global.asax.cs:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());

Глобальные фильтры Mvc регистрируются посредством объекта GlobalFilterCollection, который доступен вам с помощью метода RegisterGlobalFilters FilterConfig.cs для проектов, которые используют WebActivator:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //stuff before
        filters.Add(new MyMvcFilter());
        //stuff after
    }
}

или в файле global.asax.cs с помощью коллекции GlobalFilters.Filters для тех, у кого нет WebActivator:

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

Стоит отметить, что в обоих случаях вам не нужно наследовать соответствующий тип FilterAttribute. Фильтры Web API должны реализовывать только интерфейс System.Web.Http.IFilter, тогда как регистрация фильтра MVC проверяется, чтобы убедиться, что ваш класс наследует одну из нескольких интерфейсов фильтра, определенных в пространстве имен System.Web.Mvc.

Ответ 3

Как и MVC 4 RC, правильное имя класса HttpFilterCollection:

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
    filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

Ответ 4

Вместо использования глобальных фильтров я предпочитаю делать это:

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}

И после этого наследовать все контроллеры API от CustomizedApiControllerBase Этот подход более выразителен по сравнению с глобальными фильтрами в файле global.ascx.