Ich habe einen Web-API-Filter (mit System.Web.Http.Filters.ActionFilterAttribute
) erstellt, kann ihn jedoch nicht in ASP.Net MVC 4 zum Laufen bringen. Ich habe versucht, ihn der RegisterGlobalFilters()
Methode hinzuzufügen, aber das hat nicht funktioniert.
Wenn man also eine in ASP.Net MVC gehostete Web-API verwendet, wie registriert man Filter?
asp.net-mvc-4
asp.net-web-api
Shane Courtrille
quelle
quelle
Beachten Sie, dass diese Antwort bis zu MVC 5 / Web API 2 gilt
Kurze Antwort: MVC- und Web-API-Filter sind nicht miteinander kompatibel. Wenn Sie sie global registrieren möchten, müssen Sie jeweils die entsprechenden Konfigurationsklassen verwenden.
Lange Antwort: ASP.NET MVC und Web API sind absichtlich so konzipiert, dass sie auf ähnliche Weise funktionieren, aber es handelt sich tatsächlich um unterschiedliche Kreaturen.
Die Web-API befindet sich unter dem
System.Web.Http
Namespace, während MVC unter demSystem.Web.Mvc
Namespace lebt . Die beiden werden glücklich nebeneinander leben, aber eines enthält das andere nicht und trotz der Ähnlichkeiten im Programmiermodell sind die zugrunde liegenden Implementierungen unterschiedlich. So wie MVC-Controller und Web-API-Controller unterschiedliche Basis-Controller-Klassen erben (MVCs werden einfach benanntController
und Web-APIs werden benanntApiController
), erben MVC-Filter und Web-API-Filter von verschiedenenFilterAttribute
Klassen (beide haben in diesem Fall denselben Namen, sind jedoch separate Klassen, die leben in ihren jeweiligen Namespaces).Globale Web-API-Filter werden über das
HttpConfiguration
Objekt registriert, das Ihnen in derRegister
Methode WebApiConfig.cs zur Verfügung steht, wenn Sie eine Projektvorlage mit WebActivator verwenden:oder anders in der global.asax.cs:
Globale Mvc-Filter werden über ein
GlobalFilterCollection
Objekt registriert , das Ihnen über dieRegisterGlobalFilters
Methode FilterConfig.cs für Projekte zur Verfügung steht, die WebActivator verwenden:oder in der Datei global.asax.cs als
GlobalFilters.Filters
Sammlung für Personen ohne WebActivator:Es ist erwähnenswert, dass Sie in beiden Fällen nicht vom entsprechenden
FilterAttribute
Typ erben müssen . Web-API-Filter müssen nur die System.Web.Http.IFilter-Schnittstelle implementieren, während die MVC-Filterregistrierung überprüft, ob Ihre Klasse eine von wenigen imSystem.Web.Mvc
Namespace definierten Filterschnittstellen erbt .quelle
Ab MVC 4 RC lautet der korrekte Klassenname HttpFilterCollection :
quelle
Anstatt globale Filter zu verwenden, bevorzuge ich Folgendes:
Und danach erben Sie alle API-Controller von
CustomizedApiControllerBase
Dieser Ansatz ist im Vergleich zu globalen Filtern in der Datei global.ascx aussagekräftiger.quelle