J'ai créé un filtre Web Api (en utilisant System.Web.Http.Filters.ActionFilterAttribute
) mais je ne parviens pas à le faire fonctionner dans ASP.Net MVC 4. J'ai essayé de l'ajouter à la RegisterGlobalFilters()
méthode, mais cela n'a pas fonctionné.
Donc, si l'on utilise Web Api hébergé dans ASP.Net MVC, comment enregistrer les filtres?
asp.net-mvc-4
asp.net-web-api
Shane Courtrille
la source
la source
notez que cette réponse est vraie jusqu'à MVC 5 / Web API 2
Réponse courte: Les filtres MVC et Web API ne sont pas compatibles entre eux et si vous souhaitez les enregistrer globalement, vous devez utiliser les classes de configuration appropriées pour chacun.
Réponse longue: ASP.NET MVC et l'API Web sont délibérément conçus pour fonctionner de la même manière, mais ce sont en fait des créatures différentes.
L'API Web vit sous l'
System.Web.Http
espace de noms, tandis que MVC vit sous l'System.Web.Mvc
espace de noms. Les deux vivront heureusement côte à côte, mais l'un ne contient pas l'autre et malgré les similitudes dans le modèle de programmation, les implémentations sous-jacentes sont différentes. Tout comme les contrôleurs MVC et les contrôleurs d'API Web héritent de différentes classes de contrôleur de base (MVC est simplement nomméController
et l'API Web est nomméApiController
), les filtres MVC et les filtres d'API Web héritent de différentesFilterAttribute
classes (les deux partagent le même nom dans ce cas, mais sont des classes distinctes qui vivent dans leurs espaces de noms respectifs).Les filtres globaux de l'API Web sont enregistrés via l'
HttpConfiguration
objet mis à votre disposition dans laRegister
méthode WebApiConfig.cs si vous utilisez un modèle de projet avec WebActivator:ou autrement dans le global.asax.cs:
Mvc filtres globaux sont enregistrés au moyen d'un
GlobalFilterCollection
objet, qui est à votre disposition par laRegisterGlobalFilters
méthode de FilterConfig.cs pour les projets qui utilisent WebActivator:ou dans le fichier global.asax.cs en guise de
GlobalFilters.Filters
collecte pour ceux sans WebActivator:Il est à noter que dans les deux cas, vous n'avez pas besoin d'hériter du
FilterAttribute
type approprié . Les filtres d'API Web doivent uniquement implémenter l'interface System.Web.Http.IFilter, tandis que l'inscription de filtre MVC vérifie que votre classe hérite de l'une des rares interfaces de filtre définies dans l'System.Web.Mvc
espace de noms.la source
À partir de MVC 4 RC, le nom de classe correct est HttpFilterCollection :
la source
Au lieu d'utiliser des filtres globaux, je préfère faire ceci:
Et après cela, héritez de tous les contrôleurs api de
CustomizedApiControllerBase
Cette approche est plus expressive que les filtres globaux du fichier global.ascx.la source