asp.net-mvc-4 - net - web forms c# tutorial
¿Cómo agregar filtros ASP globales web API? (4)
A partir de MVC 4 RC, el nombre de clase correcto es HttpFilterCollection :
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
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 método RegisterGlobalFilters()
pero no lo hice no funciona
Entonces, si uno usa Web Api alojado en ASP.Net MVC, ¿cómo se registran los filtros?
El siguiente código, en mi Global.asax, funciona para mí:
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
En lugar de usar filtros globales, prefiero hacer esto:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
Y luego heredarán todos los controladores api de CustomizedApiControllerBase
Este enfoque es más expresivo en comparación con los filtros globales en el archivo global.ascx.
tenga en cuenta que esta respuesta es válida 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 diseñadas para funcionar de manera similar, pero en realidad son criaturas diferentes.
La API web vive en el espacio de nombres System.Web.Http
, mientras que MVC vive en el espacio de nombres System.Web.Mvc
. Los dos vivirán felizmente uno al lado del otro, pero uno no contiene el 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 de API web heredan diferentes clases de controlador base (MVC simplemente se denomina Controller
y la API web se llama ApiController
) Los filtros MVC y Web API heredan de diferentes clases de FilterAttribute
(ambos comparten el mismo nombre en este caso, pero están separados clases que viven en sus respectivos espacios de nombres).
Los filtros globales de la API web se registran a través del objeto HttpConfiguration
disponible en el método de Register
WebApiConfig.cs si está utilizando una plantilla de proyecto con WebActivator:
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
o de lo contrario en global.asax.cs:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Los filtros globales de Mvc se registran a través de un objeto GlobalFilterCollection
, que está disponible para usted a través del método RegisterGlobalFilters
de FilterConfig.cs para proyectos que usan WebActivator:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
o en el archivo global.asax.cs a través de la colección GlobalFilters.Filters
para aquellos sin WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
Vale la pena señalar que, en ambos casos, no es necesario heredar del tipo apropiado de FilterAttribute
. Los filtros de API web solo necesitan implementar la interfaz System.Web.Http.IFilter, mientras que el registro de filtro MVC comprueba que su clase hereda una de las pocas interfaces de filtro definidas en el espacio de nombres System.Web.Mvc
.