2012-03-01 2 views
83

Ho creato un filtro Web Api (utilizzando System.Web.Http.Filters.ActionFilterAttribute) ma non riesco a farlo funzionare all'interno di ASP.Net MVC 4. Ho provato ad aggiungerlo al metodo RegisterGlobalFilters() ma non ha funzionato.Come aggiungere i filtri Api Web ASP.Net globali?

Quindi, se si utilizza Web Api ospitato in ASP.Net MVC, come si registra un filtro?

risposta

94

Il seguente codice, nel mio Global.asax, funziona per me:

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

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

Qualcuno può spiegare cosa sta succedendo qui? Perché ci sono due set di filtri globali? Questo non rende "globale" un ossimoro? –

+5

Un set di filtri è per MVC e l'altro è per Web API. Sono due cose separate e normalmente non si desidera che i filtri vengano applicati all'altro. –

+2

Il mio filtro WebApi viene chiamato due volte. Qualcuno ha questo problema? –

11

partire dal MVC 4 RC, il nome della classe corretto è HttpFilterCollection:

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

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

Invece di usare filtri globali Preferisco farlo:

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

E dopo che eredita tutti i controller API da CustomizedApiControllerBase Questo approccio è più espressivo rispetto ai filtri globali nel file global.ascx.

62

nota che questa risposta vale fino a MVC 5/Web API 2

Risposta breve: MVC e API Web filtri non sono incrociano compatibili, e se si desidera registrare globalmente, è necessario utilizzare le classi di configurazione appropriate per ciascuna.

Risposta lunga: ASP.NET MVC e Web API sono stati appositamente progettati per funzionare in modo simile, ma in realtà sono diverse creature.

L'API Web risiede nello spazio dei nomi System.Web.Http, mentre MVC risiede nello spazio dei nomi System.Web.Mvc. I due vivranno felicemente l'uno accanto all'altro, ma uno non contiene l'altro e, nonostante le somiglianze nel modello di programmazione, le implementazioni sottostanti sono diverse. Proprio come i controller MVC e i controller API Web ereditano classi di controller di base diverse (MVC è semplicemente denominato Controller e le API Web sono denominate ApiController) I filtri MVC e i filtri API Web ereditano da diverse classi FilterAttribute (entrambe condividono lo stesso nome in questo caso, ma sono separate classi che vivono nei rispettivi spazi dei nomi). filtri globali

Web API sono registrati attraverso l'oggetto a vostra disposizione HttpConfiguration nelle metodo Register WebApiConfig.cs se si sta utilizzando un modello di progetto con WebActivator:

public static void Register(HttpConfiguration config) 
{ 
    //stuff before 
    config.Filters.Add(new MyWebApiFilter()); 
    //stuff after 
} 

o comunque nel global.asax. cs:

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

MVC filtri globali sono registrati per mezzo di un oggetto GlobalFilterCollection, che è a vostra disposizione attraverso il metodo di FilterConfig.cs RegisterGlobalFilters per i progetti che un Re utilizzando WebActivator:

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

o nel Global.asax.file di cs in via GlobalFilters.Filters collezione per coloro che non hanno WebActivator:

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

Vale la pena notare che in entrambi i casi non è necessario ereditare dalla FilterAttribute tipo appropriato. I filtri API Web devono solo implementare l'interfaccia System.Web.Http.IFilter, mentre i controlli di registrazione del filtro MVC assicurano che la classe erediti una delle poche interfacce filtro definite nello spazio dei nomi System.Web.Mvc.

+0

L'aggiunta di filtri API Web personalizzati in webapiconfig.cs funziona per me. Non capisco perché non ha funzionato quando aggiunto in global.asax.cs – Tatipaka

+0

grazie a @tatipaka. aggiungendo al webapiconfig ha funzionato. – Gokulnath