Eu criei um filtro Web Api (usando System.Web.Http.Filters.ActionFilterAttribute
), mas não consigo fazê-lo funcionar dentro do ASP.Net MVC 4. Eu tentei adicioná-lo ao RegisterGlobalFilters()
método, mas não funcionou.
Então, se alguém estiver usando Web Api hospedado no ASP.Net MVC, como registrar os filtros?
asp.net-mvc-4
asp.net-web-api
Shane Courtrille
fonte
fonte
observe que esta resposta é verdadeira até MVC 5 / Web API 2
Resposta curta: Os filtros MVC e Web API não são compatíveis entre si e, se você quiser registrá-los globalmente, deve usar as classes de configuração apropriadas para cada um.
Resposta longa: ASP.NET MVC e Web API são propositalmente projetadas para funcionar de maneira semelhante, mas na verdade são criaturas diferentes.
A API da Web reside no
System.Web.Http
namespace, enquanto o MVC vive noSystem.Web.Mvc
namespace. Os dois viverão felizmente lado a lado, mas um não contém o outro e, apesar das semelhanças no modelo de programação, as implementações subjacentes são diferentes. Assim como os controladores MVC e controladores de API da Web herdam diferentes classes de controlador de base (MVC é simplesmente nomeadoController
e API da Web é nomeadoApiController
), filtros MVC e filtros de API da Web herdam deFilterAttribute
classes (ambos compartilham o mesmo nome neste caso, mas são classes separadas que vivem em seus respectivos namespaces).Os filtros globais da API da Web são registrados por meio do
HttpConfiguration
objeto disponível para você noRegister
método WebApiConfig.cs se você estiver usando um modelo de projeto com WebActivator:ou de outra forma no global.asax.cs:
Filtros globais Mvc são registrados por meio de um
GlobalFilterCollection
objeto, que está disponível para você por meio doRegisterGlobalFilters
método de FilterConfig.cs para projetos que usam WebActivator:ou no arquivo global.asax.cs por meio de
GlobalFilters.Filters
coleção para aqueles sem WebActivator:É importante notar que, em ambos os casos, você não precisa herdar do
FilterAttribute
tipo apropriado . Filtros de API da Web precisam apenas implementar a interface System.Web.Http.IFilter, enquanto o registro do filtro MVC verifica para garantir que sua classe herde uma das várias interfaces de filtro definidas noSystem.Web.Mvc
namespace.fonte
A partir do MVC 4 RC, o nome de classe correto é HttpFilterCollection :
fonte
Em vez de usar filtros globais, prefiro fazer o seguinte:
E depois disso, herde todos os controladores da API de.
CustomizedApiControllerBase
Esta abordagem é mais expressiva em comparação com os filtros globais no arquivo global.ascx.fonte