Come aggiungere i filtri Api Web ASP.Net globali?

Ho creato un filtro Api Web (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 lavorare

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

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

nota che questa risposta vale per MVC 5 / Web API 2

Risposta breve: i filtri MVC e Web API non sono cross-compatibili e, se si desidera registrarli globalmente, è necessario utilizzare le classi di configurazione appropriate per ciascuno.

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

Le API Web risiedono nello spazio dei nomi System.Web.Http , mentre MVC vive 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 si chiamano ApiController ) I filtri MVC e i filtri API Web ereditano da diverse classi FilterAttribute (entrambi condividono lo stesso nome in questo caso, ma sono separati classi che vivono nei rispettivi spazi dei nomi).

I filtri globali dell’API Web vengono registrati tramite l’object HttpConfiguration disponibile nel metodo Register WebApiConfig.cs se si utilizza un modello di progetto con WebActivator:

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

o altrimenti nel global.asax.cs:

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

I filtri globali Mvc sono registrati tramite un object GlobalFilterCollection , che è disponibile tramite il metodo RegisterGlobalFilters di FilterConfig.cs per i progetti che utilizzano WebActivator:

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

o nel file global.asax.cs tramite la raccolta GlobalFilters.Filters per quelli senza WebActivator:

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

Vale la pena notare che in entrambi i casi non è necessario ereditare dal tipo FilterAttribute 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 class erediti una di una manciata di interfacce filtro definite nello spazio dei nomi System.Web.Mvc .

A partire da MVC 4 RC, il nome corretto della class è HttpFilterCollection :

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

Invece di usare i filtri globali, preferisco farlo:

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

E in seguito erediterà tutti i controller API da CustomizedApiControllerBase Questo approccio è più espressivo rispetto ai filtri globali nel file global.ascx.