Creé un filtro Web Api (usando System.Web.Http.Filters.ActionFilterAttribute) pero no puedo hacer que funcione dentro de ASP.Net MVC 4. Intenté agregarlo al RegisterGlobalFilters()método pero no funcionó.
Entonces, si uno está utilizando Web Api alojado en ASP.Net MVC, ¿cómo se registran los filtros?
asp.net-mvc-4
asp.net-web-api
Shane Courtrille
fuente
fuente

tenga en cuenta que esta respuesta es cierta hasta MVC 5 / Web API 2
Respuesta corta: los filtros MVC y Web API no son compatibles entre sí, y si desea registrarlos globalmente, debe usar las clases de configuración adecuadas para cada uno.
Respuesta larga: ASP.NET MVC y Web API están específicamente diseñadas para funcionar de manera similar, pero de hecho son criaturas diferentes.
La API web vive bajo el
System.Web.Httpespacio de nombres, mientras que MVC vive bajo elSystem.Web.Mvcespacio de nombres. Los dos vivirán felizmente uno al lado del otro, pero uno no contiene al otro y, a pesar de las similitudes en el modelo de programación, las implementaciones subyacentes son diferentes. Así como los controladores MVC y los controladores Web API heredan diferentes clases de controlador base (MVC simplemente se nombraControllery Web APIApiController), los filtros MVC y los filtros Web API heredan de diferentesFilterAttributeclases (ambos comparten el mismo nombre en este caso, pero son clases separadas que viven en sus respectivos espacios de nombres).Los filtros globales de la API web se registran a través del
HttpConfigurationobjeto disponible para usted en elRegistermétodo WebApiConfig.cs si está utilizando una plantilla de proyecto con WebActivator:o de lo contrario en global.asax.cs:
Los filtros globales de Mvc se registran mediante un
GlobalFilterCollectionobjeto, que está disponible a través delRegisterGlobalFiltersmétodo de FilterConfig.cs para proyectos que utilizan WebActivator:o en el archivo global.asax.cs a modo de
GlobalFilters.Filterscolección para aquellos sin WebActivator:Vale la pena señalar que en ambos casos no es necesario heredar del
FilterAttributetipo apropiado . Los filtros de API web solo necesitan implementar la interfaz System.Web.Http.IFilter, mientras que el registro del filtro MVC verifica para garantizar que su clase herede una de las pocas interfaces de filtro definidas en elSystem.Web.Mvcespacio de nombres.fuente
A partir de MVC 4 RC, el nombre de clase correcto es HttpFilterCollection :
fuente
En lugar de usar filtros globales, prefiero hacer esto:
Y después de eso, hereda todos los controladores api de
CustomizedApiControllerBaseEste enfoque es más expresivo en comparación con los filtros globales en el archivo global.ascx.fuente