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.
- IncomingRequest
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…