2012-03-01 4 views
83

He creado un filtro Web Api (usando System.Web.Http.Filters.ActionFilterAttribute) pero no puedo hacerlo funcionar dentro de ASP.Net MVC 4. Intenté agregarlo al método RegisterGlobalFilters() pero eso no funcionó.¿Cómo agregar filtros API globales de ASP.Net web?

Entonces, si uno usa Web Api hospedado en ASP.Net MVC, ¿cómo se registran los filtros?

Respuesta

94

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); 
} 
+6

¿Puede alguien explicar lo que está pasando aquí? ¿Por qué hay dos conjuntos de filtros globales? ¿Eso no hace que 'Global' sea un oxímoron? –

+5

Un juego de filtros es para MVC y el otro es para API web. Son dos cosas separadas y normalmente no querrías que se apliquen filtros para el otro. –

+2

Mi filtro WebApi se llama dos veces. Alguien tiene este problema? –

11

A partir de MVC 4 RC, el nombre de la clase correcta es HttpFilterCollection:

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

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

En lugar de utilizar filtros globales Prefiero hacer esto:

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

Y después que heredan todos los controladores api de CustomizedApiControllerBase Este enfoque es más expresivo en comparación con los filtros globales en el archivo global.ascx.

62

nota que esta respuesta es válida hasta MVC 5/Web API 2

Respuesta corta: MVC y API Web filtros no se cruzan compatibles, y si desea registrar globalmente, debe use las clases de configuración apropiadas para cada uno.

Respuesta larga: ASP.NET MVC y la API web están diseñadas expresamente para funcionar de forma similar, pero en realidad son criaturas diferentes.

Web API 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 API Web heredan diferentes clases de controlador base (MVC simplemente se llama Controller y la API web se llama ApiController) Los filtros MVC y Web API heredan de diferentes clases FilterAttribute (ambos comparten el mismo nombre en este caso, pero están separados clases que viven en sus respectivos espacios de nombres).

API Web filtros globales se registran a través del objeto HttpConfiguration a su disposición en las Register WebApiConfig.cs método 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 otra manera en el Global.asax. CS:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter()); 

MVC filtros globales se registran por medio de un objeto GlobalFilterCollection, que está disponible para usted a través del método de FilterConfig.cs RegisterGlobalFilters para proyectos que una re usando WebActivator:

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

o en global.asax.cs archivo por medio de GlobalFilters.Filters colección para los que no tienen WebActivator:

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

Vale la pena señalar que en ambos casos no es necesario para heredar del tipo apropiado 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.

+0

Agregar los filtros de API web personalizados en webapiconfig.cs funciona para mí. No entiendo por qué no funcionó cuando se agregó en global.asax.cs – Tatipaka

+0

gracias @tatipaka. añadiendo al webapiconfig funcionó. – Gokulnath