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.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

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