2012-03-01 3 views
83

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

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

ответ

94

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

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

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

Может кто-нибудь объяснить, что здесь происходит? Почему существуют два набора глобальных фильтров? Разве это не делает «Глобальный» оксюморон? –

+5

Один набор фильтров для MVC, а другой для Web API. Это две разные вещи, и обычно вам не нужны фильтры для одного приложения к другому. –

+2

Мой фильтр WebApi вызывается дважды. У кого-нибудь эта проблема? –

11

С 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.

62

обратите внимание, что этот ответ справедливо до 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, а веб-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 для проектов, что re using WebActivator:

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

или в глобальном масштабе.CS-файл путем GlobalFilters.Filters коллекции для тех, кто не WebActivator:

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

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

+0

Добавление пользовательских фильтров Web Api в webapiconfig.cs работает для меня. Я не понимаю, почему это не сработало при добавлении в global.asax.cs – Tatipaka

+0

спасибо @tatipaka. добавлено в webapiconfig. – Gokulnath

Смежные вопросы