Önceki makalelerimizde web servislere genel bir bakış yapmış ve paralel programlama konusunda değinmiştik. Bu bölümde Asp.Net Web API yapısını inceleyeceğiz.
ASP.Net Web API
Microsoft tarafından geliştirilmiş olan Asp.Net Web API REST (Representational State Transfer) tabanlı servisler geliştirebilmemize olanak sağlayan http protokolü üzerine kurulu bir kütüphanedir. Bu kütüphane Microsoft platformlarında .Net 4.0 ve üzerinde çalışmaktadır.
Makale serimizin kavramları anlattığımız ilk bölümünde REST, RESTful, SOAP ve WCF gibi servislerin neler olduklarına değinmiştik. Asp.Net ortamında web servis geliştirmek .Net 4.0 öncesinde de WCF ile elbette mümkündü. Fakat kullanımının daha karmaşık ve zorluklar içeriyor olması sebebiyle Microsoft durumu fark etti ve Asp.Net Web API yapısını çıkarttı.
Asp.Net Web API yapısı Microsoft’un yavaş yavaş terk ettiği klasik Asp.Net Web Forms yapısına benzemek yerine tüm implementasyonları Asp.Net MVC ile aynıdır. Asp.Net Web API yaşam döngüsünde kullanılan öğelerin abstract sınıflardan türetildiğini düşündüğümüzde Asp.Net MVC ile olan yapı benzerliği daha rahat anlaşılmaktadır. Asp.Net Web API yaşam döngüsü hakkında yapmış olduğumuz bu benzetmeden sonra Web API boru hattı öğelerinden başlayarak Web API yapısını inceleyelim.
Resim-1
Web API Pipeline
Asp.Net Web API mimarisindeki en önemli konunun Web API Pipeline olduğunu söyleyebilirim. Haberleşmedeki bir mesajın yaşam döngüsündeki bir isteğin istemci üzerinden ne şekilde gelerek sunucu tarafında işlendikten sonra sonuç olarak geri dönmesi sürecindeki aşamalar burada incelenmektedir. Yine MVC yapısına benzer bir şekilde Http Message Handler bir katmanda, API Controller bir katmanda ve Controller Action başka bir katmanda olacak şekilde çalışmaktadır. Resim-2’de yer alan Asp.Net Web API Pipeline görselinin yanı sıra mimariyi daha detaylı incelemek isterseniz Asp.Net Web API Posteri buraya tıklayarak inceleyebilirsiniz.
Resim-2
Resim-2’de aslında üç katmanlı bir mimariden söz ediliyor. Bunlardan ilki ve en üstte bulunan katman HttpMessageHandler katmanıdır ve içerisinde DelegateHandler, httpRoutingDispatcher ve httpControllerDispatcher tiplerini barındırır. Bu tipler http isteklerini almak ve geriye http sonuçları döndürme görevlerini yerine getirirler. Yapı içerisinde sıralı bir şekilde barınırlar ve görevlerini bu sıraya göre yaparlar. Sıralama üzerindeki görev tamamlandığında diğer katmana aktarım yaparak işleme devam edilmesini sağlarlar. Message Handler Pipeline yaşam döngüsü Resim-3’deki gibidir.
Resim-3
Web API Pipeline / Delegating Handler
İsteklerin diğer katmanlara geçmeden hemen önce gerçekleşen bir işlemdir. Dönen sonuçlara genişletilme yapılabilen yerdir. Yani dönen bir sonuçta (response) görüntüleme, filtreleme, güncelleme gibi işlemlerin yapılabildiği yerdir.
Web API Pipeline / Routing Dispatcher
Routing verisinin mesajdan elde elde eder veya kendisi resolution işlemini gerçekleştirerek verileri eşleştirir. Eşleşen veri olmaması durumunda 404 http mesajını sonuç olarak döndürür.
Web API Pipeline / Http Contoller
Message Handler pipeline’ı içerisindeki son duraktır. Yapılandırma ayarlarını ve yönlendirme bilgilerini içeren controller context nesnesine controller örneği uygulanarak aktarılır.
Web API Pipeline / Authorization Filter
Asp.Net Web API pipeline içerisindeki controller katmanının ilk adımıdır. Web servislerin çalışma yapılarıyla ilgili oldukça önemli bir işlem bu katmanda gerçekleşir. Adından da anlayabileceğimiz gibi yetkilendirme işleminin kontrol edildiği bir katmandır. Pipeline içerisindeki ilk süreç yetkilendirme filtresinden geçer eğer yetkilendirme ile ilgili bir sorun var ise Auth Filter isteği keserek kimlik doğrulama hatasını (Auth Failure) geriye döndürür.
Web API Pipeline / Model Binding
Yetkilendirme işleminin üstteki adımda başarılı olması durumunda istek bu bölüme yani Model Binding bölümüne gelmektedir. Model Binding kendisinden sonraki adım olan Action Filters’a gelene kadar kendi içerisinde üç bölüm daha barındırır. Model Bindings içerisinde yer alan bölümler ise URI Bindings, Formatter Bindings ve http Parameter Binding olarak bilinirler. URI Binding: ModelBinderParameterBinding nesnesi üzerinden IModelBinder ile IValueProvider nesnelerinin varlıklarını kontrol eder. Formatter Binding: özel mediya type formatter tanımının yapılabileceği ortamdır. Http Parameter Binding: tüm istekler üzerinden çalışabilir ve çıktı olarak http Parameter Binder tarafından herhangi bir tipi döndürebilir. Bu bölümleri daha detaylı incelemek isterseniz burayı ziyaret edebilirsiniz.
Resim-4
Web API Pipeline / Action Filter
Model Binding işleminin tamamlanması ile birlikte pipeline süreci Actions Filters çağırmak üzere ilerler. Action Filters, OnExecuting ve OnExecuted event’larını çağırmaktadır.
Web API Pipeline / Controller Action
Bu katmanda Action metot içerisindeki kod çalıştırılmaktadır. Bu işlem sonrasında geriye Action Metottan dönecek bilgiye göre geriye dönecek olan HttpResponseMessage’ı, Result Conversion devreye girerek oluşturur.
Asp.Net Web API pipeline incelendiğinde MVC yapısına olan benzerliği daha iyi anlaşılmaktadır. Katmanlar seviyesinde işlemleri gerçekleştiren Web API’de bir http mesajının yaşam döngüsünü beraber incelemiş olduk. Dikkat edileceği üzere pipeline her işlem adımına indirgenmiş ve esnetilebilir bir durumdadır. Bu da biz geliştiricilere Asp.Net Web API’nin oldukça esnek bir yapıya sahip olduğunu bir kez daha göstermektedir.
Asp.Net Web API’nin sahip olduğu mimari özellikleri incelemeye devam ettiğimizde karşımıza görev bazlı dizayn olarak bilinen Task Based Design, Test edilebilirlik, HttpConfiguration sınıfı, Built-in Dependency Injection ve HttpContext bağımsızlığı olarak bilinen yapılar çıkmaktadır. Şimdi bu yapıları tek tek inceleyelim.
Resim-5
Web API Task Based Design
Asp.Net Web API Task Based Design kavramı aslında oldukça bir anlam içermektedir. Bu kavram bize bir isteğin başlayıp içerisindeki yaşam döngüsünde kurallı metotları barındırması ve geriye response etmesi ile tasarlanabildiğini söylemektedir.
Web API Test Edilebilir Yapı
Asp.Net Web API mimarisinin Asp.Net MVC mimarisine oldukça benzer bir yapıya sahip olduğunu yeri geldikçe söylemekte fayda görüyorum çünkü test edilebilirlik ile ilgili yine bu akrabalık işe yarıyor. Asp.Net Web API mimarisinde Unit Test veya Integration Test yazımı oldukça kolaydır.
Web API Built-In Dependency Injection
Asp.Net Web API ile birlikte gelen bir yenilik ise dependency injection frameworklerinin kullanılabiliyor olmasıdır. MVC 5 ve Asp.Net Web API platformunda IControllerFactory’i tanımlayan sınıflar yazıp daha sonra builder olarak set etmek yerine DependencyResolver.SetResolver metodunu kullanmak yeterli olacaktır. Bu metot zaten parametre olarak IDependencyResolver tipini implemente etmektedir.
Web API Http Context Bağımsızlığı
Task Based bir yapı üzerinde Web API geliştirebildiğimiz bu mimari de yazdığımız uygulamalar için isteğin oluştuğu thread yerine farklı bir katmandaki farklı bir thread üzerinde işe yapıyor olabiliriz. Eğer böyleyse Asp.Net Web API modelinde HttpContext.Current metodu ile isteklerin davranışları hakkında bilgi sahibi olamayız. Çünkü HttpContext.Current metodu thread-safe olmayan bir statik metottur. Bu metot yerine yine MVC ile benzerliğine değinmeden edemeyeceğim Request.Properties path’inde bulunan Dictionary metodu kullanılır.
Web API Http Configuration
HttpConfiguration sınıfı, HttpContext’ten farklı olarak statik metot içermemektedir. Amacı çağrılan yani invoke durumundaki uygulama hakkındaki çeşitleri bilgileri taşımaktır. İçerisinde Route, Filter, Formatter, Dependecy Resolver ve Message Handler property’leri bulunur.
Kavramlarla Asp.Net Web API yazı dizimizin bu bölümünde .Net 4.0 ve sonrası Asp.Net Web API yapısını incelemiş olduk. Sonraki bölümlerde görüşmek dileğiyle.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
https://social.msdn.microsoft.com/Forums/tr-TR/home
TAGs: asp.net, asp.net web servis, asp.net web API, API, Rest Servis, Soap, Wcf servis, Thread, ThreadPool, Task, Task Management, Task.Factory, Paralel Programlama, Asenkron Programlama, Görevler