web-dev-qa-db-fra.com

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 n'a pas fonctionné.

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

96
Shane Courtrille

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);
}
108
Dave Bettin

notez que cette réponse est valable jusqu'à MVC 5/Web API 2

Réponse courte: Les filtres de MVC et de l'API Web 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 Web API sont conçus à dessein pour fonctionner de manière similaire, mais il s’agit en réalité de créatures différentes.

L'API Web vit sous le System.Web.Http espace de noms, alors que MVC vit sous le System.Web.Mvc espace de noms. Les deux vivront côte à côte avec bonheur, 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 API Web héritent de différentes classes de contrôleurs de base (MVC est simplement nommé Controller et les API Web est nommé ApiController) Les filtres MVC et les filtres API Web héritent de différentes classes FilterAttribute ( les deux partagent le même nom dans ce cas, mais sont des classes séparées qui vivent dans leurs espaces de noms respectifs).

Les filtres globaux de l'API Web sont enregistrés via l'objet HttpConfiguration disponible dans la méthode Register 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 autrement dans le global.asax.cs:

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

Les filtres globaux MVC sont enregistrés via un objet GlobalFilterCollection, qui vous est disponible via la méthode RegisterGlobalFilters de FilterConfig.cs pour les projets utilisant WebActivator:

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

ou dans le fichier global.asax.cs au moyen de GlobalFilters.Filters collection pour ceux sans WebActivator:

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

Il est à noter que dans les deux cas, vous n'avez pas besoin d'hériter du type approprié FilterAttribute. Les filtres API Web doivent uniquement implémenter l'interface System.Web.Http.IFilter, tandis que l'enregistrement de filtre MVC vérifie que votre classe hérite d'une des nombreuses interfaces de filtre définies dans le System.Web.Mvc espace de noms.

82
joelmdev

À 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);
}
12
nuzzolilo

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

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

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

8
Mahmoud Moravej