Filtrelerin Çalışma Kapsamları ve Sıralaması

Bu makalemde ASP.NEt Core MVC Filtrer ların çalışma zamanı kapsamlarını inceleyeceğiz.  ASP.NET Core MVC Filter ile ilgili önceki yazılarımı okumanızı tavsiye ederim.

Bir filtre pipeline a üç kapsamdan biri ile eklenebilir. Dilerseniz belirli bir contoller yada action a attribute kullanarak ekleyebilirsiniz. Bunun yerine filtrenizi tüm controller ve action lar için global olarak Startup sınıfı içerisindeki ConfigureService metodunda MvcOptions.Filters koleksiyonuna kayıt edebilirsiniz.


public void ConfigureServices(IServiceCollection services)
{
 services.AddMvc(options =>
 {
 options.Filters.Add(new AddHeaderAttribute("GlobalAddHeader",
 "Result filter added to MvcOptions.Filters")); // an instance
 options.Filters.Add(typeof(SampleActionFilter)); // by type
 options.Filters.Add(new SampleGlobalActionFilter()); // an instance
 });
 services.AddScoped<AddHeaderFilterWithDi>();
}

Varsayılan Çalıştırma Sırası

Pipeline ın belirli evrelerine bir çok filtre eklediğiniz zaman, kapsam varsayılan filtre yürütme sırasını belirler. Global filtreler class filtrelerini çevreler, class filtrelerde metot filtrelerini çevreler. Matruşkaya benzer bir yapıdır. Bu iç içe yapı sayesinde filtrelerimizdeki after kodlarımız before kodlarımızın ters sırası ile çalışır.

  • Global uygulanan before filtre kodları
    • Controller lara uygulanan before filtre kodları
      • Action lara uygulanan before filtre kodları
      • Action lara uygulanan after filtre kodları
    • Controller lara uygulanan after filtre kodları
  • Global uygulanan after filtre kodları

Senkron action filtreleri için filtre metotlarının çağırılma sırası

Sequence Filter scope Filter method
1 Global OnActionExecuting
2 Controller OnActionExecuting
3 Method OnActionExecuting
4 Method OnActionExecuted
5 Controller OnActionExecuted
6 Global OnActionExecuted

Eğer Asenkron bir filtre içerisinde isek OnStageExecutionAsync metodu, tüm filtreleri stack içerisinde dar bir kapsamda çalışır.

Varsayılan Sıralamayı Değiştirme

Varsayılan çalıştırma sıralamasını IOrderFilter ın uygulanması ile override edebiliriz. Bu interface sıralama işlemi için Order property sini sağlar. Order özelliği kapsamdaki yürütme sırasını belirler.

Daha düşük Order değerine sahip filtrenin before kodu yüksek Order değerine sahip filtrenin before kodundan önce çalışır.

Daha düşük Order değerine sahip filtrenin after kodu yüksek Order değerine sahip filtrenin after kodundan sonra çalışır.

Order property sinin değerini yapıcı metot ile verebilirsiniz.


[MyFilter(Name = "Controller Level Attribute", Order=1)]

Aynı 3 Action filtresine sahipseniz ve controller ve global filtrelerin Order özelliklerini sırası ile 1 ve 2 olarak ayarlarsanız yürütme sırası tersine çevrilmiş olur.

Sequence Filter scope Order property Filter method
1 Method 0 OnActionExecuting
2 Controller 1 OnActionExecuting
3 Global 2 OnActionExecuting
4 Global 2 OnActionExecuted
5 Controller 1 OnActionExecuted
6 Method 0 OnActionExecuted

Order özelliği filtrelerin çalışma sırasını belirlemek için mükemmeldir. Filtreler öncelikle Order değerine göre sıralanır. Tüm built-in filtreler IOrderedFilter arayüzünü uygular ve varsayılan olarak Order özelliğinin değeri 0 dır. Sıralamak için tek yapmanız gereken 0 dan başka değerler vermek.