Как добавить глобальные фильтры ASP.Net Web Api? - PullRequest
93 голосов
/ 01 марта 2012

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

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

Ответы [ 4 ]

106 голосов
/ 01 марта 2012

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

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

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
81 голосов
/ 16 апреля 2014

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

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

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

Веб-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.

12 голосов
/ 21 июня 2012

Начиная с 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);
}
8 голосов
/ 01 марта 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...