Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core 2 MVC’de Custom Routing Constraint Oluşturma

Merhaba,

Bu içeriğimizde Asp.NET Core 2 MVC’de özel routing kısıtlamaları olan “Custom Routing Constraint” yapılarının nasıl inşa edildiğini öğreneceğiz. Custom routing constraint yapılarını inşa ederken, gelen bir isteğin kullandığı parametrenin değerini filtreleyerek, ceyran eden işleyişe müdahalede bulunacak ve beklediğimiz şartlara uygun parametre değerleri eşliğinde bir talep söz konusu değilse ilgili route yapısı tetiklenmeyecek ve korumaya alınacaktır.

Route Kısıtlamalarını Kullanacağımız Durumlar

Custom routing constraint yapılarını aşağıdaki durumlarda kullanmayı tercih edebiliriz;

  • Requestleri özel parametre değerleriyle karşılamak istediğimizde,
  • Alt ya da üst limitli sayısal verilerle çalışmak istediğimizde,
  • Sadece metinsel, sayısal ya da mantıksal tipte değerlerden herhangi birinin parametre değeri olarak belirtilmesini istediğimizde
  • vs. vs.

route kısıtlamalarını kullanabiliriz.

IRouteConstraint Interface’i

Özel route kısıtlamalarını oluşturabilmek için IRouteConstraint interface’ini kullanmaktayız. Bu interface, uygulandığı sınıfa “Match” isminde bir metot implement etmektedir. Bu metot içerisinde belirteceğimiz kriterler ile requestten gelen parametre değerlerini eşleştirecek ve bu eşleştirme neticesinde geriye true ya da false değeri dönecektir. Eğer true değeri dönerse tetiklenen route ilgili parametre değeri ile tetiklenecektir. Yok eğer false değeri gelirse 404 hatası verilecektir.

    public interface IRouteConstraint
    {
        bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection);
    }

“Match” metodunun parametrelerini incelersek eğer;

  • HttpContext httpContext
    Yapılan request ile birlikte response, session vs. gibi tüm http durumlarıyla ilgili gerekli bilgileri içerir.
  • IRouter route
    Kısıtlamalara ait yönlendiricidir.
  • string routeKey
    Kısıtlayıcının bağlandığı parametrenin adını tutmaktadır.
  • RouteValueDictionary values
    Url içerisindeki tüm parametreleri tutmaktadır.
  • RouteDirection routeDirection
    Request neticesinde bir url’in işleniyor mu? oluşturuluyor mu? bilgisini verir. “IncomingRequest” ve “UrlGeneration” olmak üzere iki adet değere sahiptir.

    • IncomingRequest
      Url’in işlendiğine dair bilgi verir.
    • UrlGeneration
      Url’in oluşturulduğuna dair bilgi verir.

Custom Routing Constraint Oluşturma ve Kullanma

Custom routing constraint oluşturmak için aşağıdaki örneği inceleyiniz;

    public class WeebDayConstraint : IRouteConstraint
    {
        string[] _days = { "pazartesi", "sali", "carsamba", "persembe", "cuma", "cumartesi", "pazar" };
        public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
         => _days.Contains(values[routeKey]?.ToString().ToLower());
    }

Yukarıdaki örnek route constraint kodlarını incelerseniz eğer “string” tipindeki “_days” isimli dizide bulunan değerlere eş değer olan parametre değerleri durumunda request çalıştırılacak ve ilgili route tetiklenecektir.

Custom routing constraint yapımızı oluşturduktan sonra sıra route yapılanmasında kullanmak istediğimiz route şemalarındaki parametrelere ilgili constrainti aşağıdaki gibi tanımlamaya gelmiş bulunmaktadır.

.
.
.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "Default",
                    template: "{controller=Home}/{action=Index}/{day?}",
                    constraints: new { day = new WeebDayConstraint() },
                    defaults: new { }
                        );
            });
        }
.
.
.

Yukarıdaki örnek kod bloğunda gördüğünüz gibi “Default” route’unun “day” parametresine oluşturduğumuz custom constraint tanımlanmış bulunmaktadır.

Ayrıca bir başka tanımlama yöntemi olarak aşağıdaki ayarlamaları gerçekleştirebiliriz.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            #region Route Custom Constraint
            services.Configure<RouteOptions>(options => options.ConstraintMap.Add("weekday", typeof(WeebDayConstraint)));
            #endregion

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "Default",
                    template: "{controller=Home}/{action=Index}/{day:weekday?}"
                        );
            });
        }
    }

Görüldüğü üzere “ConfigureServices” metodunda oluşturmuş olduğumuz custom constraint sınıfımızı “weekday” etiketiyle “RouteOptions” nesnesi aracılığıyla ayarlamakta ve “Configure” metodu içerisindeki route yapılanmasında kullanılacağı parametrede “day:weekday” şeklinde kullanabilmekteyiz.

Bu tanımlamalardan sonra “day” parametresine custom routing constraint olarak tasarladığımız “WeebDayConstraint” isimli classımızda belirttiğimiz gün değerleri dışında bir değer verildiği taktirde ilgili route tetiklenmeyecek ve kullanıcıya 404 hatası gönderilecektir.

Dolayısıyla bizler route şemalarındaki parametrelerin alabileceği değerleri özel kısıtlamalar oluşturarak filtreleyebilmekte ve route şemalarımızın işlevsel güvenliğini bu şekilde sağlayabilmekteyiz.

İlgilenenlerin faydalanması dileğiyle…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir