İçeriğe geç →

Asp.NET Web API’da IHttpRouteConstraint Implementasyonu ile Versiyonlama

Merhaba arkadaşlar. Bu makale konumda ise Asp.NET Web API’da nasıl versiyonlama yapılabileceğini görürken bir yandan da action method’lar üzerinde nasıl custom constraint’ler ekleyebileceğimizi göreceğiz. Dilerseniz fazla uzatmadan hemen konuya girelim. 🙂

Asp.NET Web API içerisinde IHttpRouteConstraint interface’ini implemente ederek, custom constraint oluşturabilmek mümkündür. “System.Web.Http.Routing” namespace’i altında bulunan IHttpRouteConstraint interface’i, aşağıdaki gibi bir method imzasına sahiptir.

Dilerseniz bir örnek üzerinde IHttpRouteConstraint interface’inin, implementasyonunu gerçekleştirelim. Gerçekleştirecek olduğumuz örnekte HTTP Header’ı kullanarak, controller üzerinde custom olarak versiyonlama işlemi gerçekleştireceğiz.

Şimdi VersionConstraint isminde yeni bir class oluşturalım ve IHttpRouteConstraint interface’ini aşağıdaki gibi implemente edelim.

Implementasyona ilk baktığımızda, constructor aracılığı ile dışarıdan geçerli olmasını istediğimiz “allowedVersion” parametresini alıyoruz. IHttpRouteConstraint interface’inden gelen “Match” method’unda ise; Request’in Header’ı üzerinde custom olarak set edilmiş olan “api-version” bilgisini alarak, constructor üzerinden elde etmiş olduğumuz “allowedVersion” parametresi ile karşılaştırıyoruz.
Artık oluşturmuş olduğumuz VersionConstraint class’ını route belirtirken kullanabilmek için RouteFactoryAttribute abstract class’ından yararlanarak, aşağıdaki gibi yeni bir attribute oluşturalım ve implemente edelim.

Implementasyona baktığımızda ilk parametrede constructor üzerinden route template’i alıp, RouteFactoryAttribute’ün construtor’ına geçiyoruz. İkinci parametrede ise geçerli olmasını istediğimiz versiyon numarasını alarak, RouteFactoryAttribute üzerinde bulunan Constraints dictionary’sine VersionConstraint’i, geçerli olmasını istediğimiz versiyon numarası ile beraber ekliyoruz.

Constraint’imiz hazır olduğuna göre şimdi yeni bir controller oluşturarak kullanımına bir bakalım.

Order_V1Controller’a baktığımızda Get method’u üzerinde VersionedRoute attribute’ünü görebilmekteyiz. İlk parametresinde geçerli olmasını istediğimiz template route’u gönderirken, ikinci parametresinde ise geçerli olmasını istediğimiz versiyon numarasını set ediyoruz.
Artık her şey hazır olduğuna göre örneğimizi deneyebilmek için Fiddler üzerinden “api/Order” URI’ına bir GET isteğinde bulunacağız. Aşağıda şekildeki gibi GET isteğinde bulunurken HTTP Request Header’ına, “api-version” parametresini ekleyerek “2” değerini verelim.

10.6.2.1.1

Fiddler üzerinde GET request’ini yukarıda şekildeki gibi ayarladıktan sonra execute edelim ve IHttpRouteConstraint interface’ini implemente ettiğimiz VersionConstraint class’ı içerisindeki “Match” method’una, debug anında bir bakalım.

10.6.2.1.2

GET isteğinde bulunduğumuz için request, öncelikle Order_V1Controller içerisindeki Get method’una düşmüştür. Get method’una eklemiş olduğumuz VersionedRoute attribute’ünden dolayı, henüz method invoke edilmeden önce constraint kontrolü için request, “Match” method’una düşmüştür.

NOT: Asp.NET Web API uygulaması ilk kez ayağa kalktığında, action method üzerine eklemiş olduğumuz “VersionedRoute” attribute’ü aracılığı ile Constraints property’si içerisine oluşturmuş olduğumuz “VersionConstraint” class’ı eklenmektedir. Bu sayede ilgili action method’a bir request geldiğinde, VersionConstraint class’ı içerisindeki “Match” method’una düşmektedir.

10.6.2.1.3

Match method’u içerisinde ise Request Header’ı üzerinde göndermiş olduğumuz “api-version” bilgisini elde edebilmek için GetVersionFromRequestHeader method’u çağırılıyor ve yukarıdaki gibi versiyon numarası Request Header üzerinden elde ediliyor.

10.6.2.1.4

Match method’u versiyon numarasını elde ettikten sonra VersionConstraint attribute’ünü kullanırken, göndermiş olduğumuz “AllowedVersion” parametresi ile karşılaştırarak, bu constraint’in match olup olmadığına karar veriyor. Asp.NET Web API bu işlemin sonucunda ise ilgili route’un geçerli olup olmayacağına karar vermektedir.
Biz örneğimizde “AllowedVersion” parmetresini “1” olarak belirlediğimiz ve Request Header üzerinden “api-version” parametresini “2” olarak gönderdiğimiz için, Asp.NET Web API bize aşağıdaki gibi bir sonuç geri dönecektir.

Bu durumda “api-version” parametresini “1” olarak göndermiş olsaydık, Get method’u başarılı bir şekilde invoke ediliyor olacaktı. Bu şekilde action method bazında versiyonlama işlemi yapabilmek mümkün olmaktadır.

Dilerseniz sizde IHttpRouteConstraint interface’ini custom olarak implemente ederek, Match method’u içerisinde dilediğiniz işlemleri gerçekleştirebilirsiniz. Gerçekleştirmiş olduğumuz örneğin uygulamasına ekten erişebilirsiniz. Biraz bıraktığım aradan sonra umarım faydalı bir makale olmuştur.

RoutingExample

Bu makale toplam (1166) kez okunmuştur.

5
1



Kategori: Asp.Net Web API

3 Yorum

  1. Erdem Erdem

    Bilgilendirme için çok teşekkürler. İşime yaradı. +rep 😀

  2. Omer faruk Omer faruk

    Api route prefix uzerinden versiyon yapmayip bu implementasyony yapmanizin ne gibi bir avantaji soz konusu?

    Tesekkurler

    • Merhaba, buradaki asıl amaç route ile birlikte versiyonlama yapmak değil aslında. Buradaki amaç IHttpRouteConstraint interface’inin implementasyonunu göstermek ve bir örnek olarak da versiyonlama gibi constraint işlemlerinin yapılabilmesini göstermek. Öte yandan versiyonlama yapmayıp, business use-case’lerinize göre istediğiniz constraint’leri implemente edebilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*