Global ASP.Net Web Api Filtreleri nasıl eklenir?


98

Bir Web Api filtresi oluşturdum (kullanarak System.Web.Http.Filters.ActionFilterAttribute) ancak ASP.Net MVC 4 içinde çalışmasını sağlayamıyorum. RegisterGlobalFilters()Yönteme eklemeyi denedim ama işe yaramadı.

Öyleyse, ASP.Net MVC'de barındırılan Web Api kullanılıyorsa, filtreler nasıl kaydedilir?

Yanıtlar:


110

Global.asax'ımdaki aşağıdaki kod benim için çalışıyor:

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

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

6
Biri burada neler olduğunu açıklayabilir mi? Neden iki grup Genel filtre var? Bu, 'Global'i bir tezat yapmaz mı?
Luke Puplett

6
Bir dizi filtre MVC için, diğeri Web API içindir. Bunlar iki ayrı şeydir ve normalde birinin diğerine uygulanmasını istemezsiniz.
Shane Courtrille

2
WebApi filtrem iki kez çağrılıyor. Bu sorunu olan var mı?
Andrew Kalashnikov

87

bu cevabın MVC 5 / Web API 2'ye kadar geçerli olduğunu unutmayın

Kısa yanıt: MVC ve Web API filtreleri çapraz uyumlu değildir ve bunları genel olarak kaydetmek istiyorsanız, her biri için uygun yapılandırma sınıflarını kullanmanız gerekir.

Uzun yanıt: ASP.NET MVC ve Web API kasıtlı olarak benzer şekilde çalışmak üzere tasarlanmıştır, ancak aslında farklı yaratıklardır.

Web API System.Web.Httpad alanı altında yaşarken, MVC System.Web.Mvcad alanı altında yaşar . İkisi mutlu bir şekilde yan yana yaşayacak, ancak biri diğerini içermiyor ve programlama modelindeki benzerliklere rağmen temeldeki uygulamalar farklı. MVC denetleyicileri ve Web API denetleyicilerinin farklı temel denetleyici sınıflarını devralması gibi (MVC'ler basitçe adlandırılır Controllerve Web API'leri adlandırılır ApiController) MVC filtreleri ve Web API filtreleri farklı FilterAttributesınıflardan miras alır (bu durumda her ikisi de aynı adı paylaşır, ancak canlı olan ayrı sınıflardır) kendi ad alanlarında).

Web API genel filtreleri, WebActivator ile bir proje şablonu kullanıyorsanız, WebApiConfig.cs yönteminde kullanabileceğiniz HttpConfigurationnesne aracılığıyla kaydedilir Register:

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

veya aksi takdirde global.asax.cs içinde:

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

Mvc genel filtreleri, WebActivator kullanan projeler için FilterConfig.cs yöntemi GlobalFilterCollectionaracılığıyla kullanabileceğiniz bir nesne yoluyla RegisterGlobalFilterskaydedilir:

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

veya GlobalFilters.FiltersWebActivator olmayanlar için toplama yoluyla global.asax.cs dosyasında :

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

Her iki durumda da uygun FilterAttributetürden miras almanıza gerek olmadığını belirtmek gerekir . Web API Filtreleri yalnızca System.Web.Http.IFilter arayüzünü uygulamaya ihtiyaç duyarken, MVC filtre kaydı, sınıfınızın System.Web.Mvcad alanında tanımlanan bir avuç filtre arayüzünden birini miras aldığından emin olmak için kontrol eder .


Webapiconfig.cs dosyasına özel Web Api filtreleri eklemek benim için çalışıyor.
Global.asax.cs

teşekkürler @tatipaka. webapiconfig'e ekleme çalıştı.
Gokulnath

12

MVC 4 RC'den itibaren doğru sınıf adı HttpFilterCollection'dır :

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

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

8

Global filtreler kullanmak yerine şunu yapmayı tercih ederim:

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

Ve bundan sonra tüm api denetleyicilerini devralın CustomizedApiControllerBase Bu yaklaşım, global.ascx dosyasındaki genel filtrelere kıyasla daha anlamlı.


System.Web.Http.Filters.ActionFilterAttribute'tan miras alan bir Filtre oluşturdum ve bunu doğrudan ihtiyaç duyduğum yöntemlerde kullanmaya başladım. Sadece çalışıyor, öyleyse neden kayıt olmam gerekmiyor?
2019

@joedotnot Belirli olanlarla değil, "küresel" filtrelerle ilgilidir. Hangi yöntemi filtrelemek istediğinizi belirleyebiliyorsanız, yaklaşımınız uygundur, ancak denetleyici eylemlerinden bağımsız olarak filtrelemek istediğinizde genel filtrelere ihtiyacınız vardır.
Mahmoud Moravej
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.