nota che questa risposta è vera fino a MVC 5 / Web API 2
Risposta breve: i filtri MVC e API Web non sono compatibili tra loro e se si desidera registrarli a livello globale, è necessario utilizzare le classi di configurazione appropriate per ciascuno.
Risposta lunga: ASP.NET MVC e l'API Web sono appositamente progettati per funzionare in modo simile, ma in realtà sono creature diverse.
L'API Web risiede nello System.Web.Http
spazio dei nomi, mentre MVC risiede nello System.Web.Mvc
spazio dei nomi. I due vivranno felicemente fianco a fianco, ma uno non contiene l'altro e nonostante le somiglianze nel modello di programmazione, le implementazioni sottostanti sono diverse. Proprio come i controller MVC ei controller API Web ereditano classi controller di base diverse (MVC è semplicemente denominato Controller
e API Web è denominato ApiController
) I filtri MVC ei filtri API Web ereditano da FilterAttribute
classi diverse (entrambi condividono lo stesso nome in questo caso, ma sono classi separate che vivono nei rispettivi spazi dei nomi).
I filtri globali dell'API Web vengono registrati tramite l' HttpConfiguration
oggetto disponibile nel Register
metodo WebApiConfig.cs se stai utilizzando un modello di progetto con WebActivator:
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
o altrimenti in global.asax.cs:
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
I filtri globali Mvc vengono registrati tramite un GlobalFilterCollection
oggetto, disponibile tramite il RegisterGlobalFilters
metodo 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 a titolo di GlobalFilters.Filters
raccolta per chi non ha WebActivator:
GlobalFilters.Filters.Add(new MyMvcFilter());
Vale la pena notare che in entrambi i casi non è necessario ereditare dal FilterAttribute
tipo appropriato . I filtri API Web devono implementare solo l'interfaccia System.Web.Http.IFilter, mentre la registrazione del filtro MVC verifica che la tua classe erediti una delle poche interfacce di filtro definite nello System.Web.Mvc
spazio dei nomi.