101 votes

Comment ajouter des filtres ASP.Net Web Api globaux?

J'ai créé un filtre Web Api (avec 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 méthode RegisterGlobalFilters() , mais cela n'a pas fonctionné.

Ainsi, si l’on utilise Web Api hébergé dans ASP.Net MVC, comment enregistrer des filtres?

114voto

Dave Bettin Points 1374

Le code suivant, dans mon Global.asax, fonctionne pour moi:

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

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

91voto

joelmdev Points 2215

Réponse courte: MVC et Web API filtres ne sont pas de la croix-compatible, et si vous voulez vous inscrire à travers le monde, vous devez utiliser la configuration appropriée des classes pour chaque.

Réponse longue: ASP.NET MVC et Web API sont délibérément conçus pour fonctionner d'une manière similaire, mais ils sont en fait des créatures différentes.

L'API Web de la vie en vertu de l' System.Web.Http d'espace de noms, alors que MVC vit sous l' System.Web.Mvc d'espace de noms. Les deux seront heureux de vivre 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 Web API contrôleurs hériter de base différentes classes de contrôleur (MVC est simplement nommée Controller et Web API est nommé ApiController) MVC filtres et Web API filtres hériter de différents FilterAttribute classes (les deux partagent le même nom, dans ce cas, mais sont des classes séparées, qui vivent dans leurs espaces de noms).

L'API Web mondial filtres sont enregistrés par le biais de l' HttpConfiguration d'objets disponibles dans l' Register méthode WebApiConfig.cs si vous utilisez un modèle de projet avec WebActivator:

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

ou sinon dans le monde.asax.cs:

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

Mvc mondiale filtres sont enregistrés par un GlobalFilerCollection de l'objet, qui est à votre disposition par de la RegisterGlobalFilters méthode de FilterConfig.cs pour les projets qui sont à l'aide de WebActivator:

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

ou dans le monde.asax.cs fichier par GolbalFilters.Filters de la collecte pour les personnes sans WebActivator:

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

Il est intéressant de noter que dans les deux cas, vous n'avez pas besoin d'hériter de l' FilterAttribute de type API Web Filtres besoin d'implémenter le Système.Web.Http.IFilter interface, et MVC filtre d'enregistrement des vérifications pour s'assurer que votre classe hérite d'un d'une poignée de filtre interfaces définies dans le Système.Web.Mvc espace de noms.

12voto

Nuzzolilo Points 411

A partir de MVC 4 RC, le nom de classe correct est HttpFilterCollection :

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

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

8voto

Mahmoud Moravej Points 1490

Au lieu d'utiliser des filtres globaux, je préfère faire ceci:

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

Et ensuite, héritez de tous les contrôleurs api de CustomizedApiControllerBase Cette approche est plus expressive par rapport aux filtres globaux du fichier global.ascx.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X