OWIN; Hikayenin Devamı

   OWIN ile yeni tanışanlar için bir önceki makalemde güzel bir giriş yaptığımıza inanıyorum. İlk OWIN katmanımızı (middleware) yazarak Katana yardımıyla tüm bileşenlerimizi bir araya getirdik. Tarayıcıdan yaptığımız istek sonrasında konsolda ilk loglarımızı gördük. Tabi süreç bununla bitmiyor. Hele ki daha bir web sayfası bile gösteremediğimizi düşünecek olursak 🙂 Bu makalemde, kaldığımız yerden devam ederek tamamlanmış bir süreçle noktalayacağız.

  Yazdığımız C# koduyla dinamik bir içirik sunmak için takip edebileceğimiz ilk yol bir katman olacaktır. Aslına bakarsanız bu yolu takip etmenin benim için avantajı sizle bir önceki makalemde paylaştığım OWIN’inin katmanlı mimarisini biraz daha yakında görebilecek olmamız. Vereceğim örnek kısaca kullanıcıya talep ettiği adresi belirterek kullanıcıyı karşılayan basit bir çıktı olacak;

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Threading.Tasks;
using System.Text;

namespace Enterprisecoding.MerhabaOWIN {
    using AppFunc = Func<IDictionary<string, object>, Task>;

    public class DinamikCikti {
        private readonly AppFunc birSonrakiKatman;

        private const string YANIT = "<p>{0} adresini talep ettiniz.<br>OWIN katmanından merhaba</p>";

        public DinamikCikti(AppFunc birSonrakiKatman) {
            if (birSonrakiKatman == null) {
                throw new ArgumentNullException("birSonrakiKatman");
            }

            this.birSonrakiKatman = birSonrakiKatman;
        }

        public Task Invoke(IDictionary<string, object> environment) {
            var istekAdresi = (string)environment["owin.RequestPath"];

            var yanitIcerigi = Encoding.UTF8.GetBytes(string.Format(YANIT, istekAdresi));

            var yanitAkisi = (Stream)environment["owin.ResponseBody"];
            var yanitBasliklari = (IDictionary<string, string[]>)environment["owin.ResponseHeaders"];

            yanitBasliklari["Content-Length"] = new[] { yanitIcerigi.Length.ToString(CultureInfo.InvariantCulture) };
            yanitBasliklari["Content-Type"] = new[] { "text/html; charset=UTF-8" };

            return yanitAkisi.WriteAsync(yanitIcerigi, 0, yanitIcerigi.Length);

        }
    }
}

   Sizlere daha öncede bahsetmiştim; OWIN http protokolünün hemen üzerinde yer almakta. Dolayısıyla oldukça rahat bir şekilde yanıt olarak dönen http başlık bilgilerini ve yanıt içeriğini düzenleyebiliyoruz. Yukarıdaki kod parçacığına dikkat edecek olursanız ortam sözlüğü içerisinden talep edilen adres okunuyor (owin.RequestPath) ve bu bilgi kullanılarak bir yanıt içeriği oluşturuluyor. Tarayıcının html yanıt verildiğini anlayabilmesi adına başlık içerine bu bilgi de yerleştiriliyor (owin.ResponseHeaders değerleri arasından Content-Type düzenleniyor). Son olarak da oluşturulan yanıt içeriği asenkron olarak owin.ResponseBody parametresi ile alınan yanıt akışına yazılıyor.

   Bu kısa adımlar ardından tabi ki bu katmanımızı da yapılandırma sırasında belirtmemiz gerekli. Bunun için yapmamız gereken Startup sınıfı içerisindeki Configuration fonksiyonuna bir use satırı daha eklemek. İşimiz bittiğinde Startup sınıfımız aşağıdaki gibi olacaktır;

public class Startup {
    public void Configuration(IAppBuilder builder) {
        builder.Use(typeof(IsMantigi));
        builder.Use(typeof(DinamikCikti));
    }
}
Dinaik çıktı katmanımızı da eklediken sonra elde ettiğimi sonuç

   Gördüğünüz gibi her katman modüler şekilde, birbirinden bağımsız olarak tasarlanmış olmalarına karşın birlikte oldukça güzel sonuçlar sunmaktalar.

   OWIN’in sunduğu bu bağımsızlık sayesinde geliştirilen NancyFX, SignalR,  Web API v.b. katmanlar biz geliştiricilerin hizmetine sunulmuş durumda. Öte yandan ihtiyacımız olan kullanıcı doğrulaması konusunda da Microsoft’un açık kaynak kodlu OWIN katmanları da bu yılın son çeyreğinde karşımıza çıkacak.

Leave a Comment

en_USEnglish