Yeni Başlayanlar için OWIN

Bookmarks Black Folder

   Web teknolojileri ile ilgileniyorsanız bir şekilde OWIN’i duyduğunuzu tahmin ediyorum. Duymadıysanız da sorun yok, okumaya devam edin. Bu makalemde OWIN’e kulak dolgunluğu olan ya da ile ilk kez tanışanlar için dilim döndüğünce ne olduğundan bahsetmeye çalışacağım. Amacım teknik detaylara çok boğulmadan, mümkün olduğunca sade şekilde OWIN “okur yazarı” olmanızı sağlamak 😉

   Öncelikle OWIN kelimesinin Open Web Interface for .Net (.Net için açık web arayüzü) olduğuyla söze başlayalım. Bir teknoloji olmaktan ziyade bir standart olan OWIN, .Net web sunucuları ile yine .Net ile geliştirilmiş web uygulamalarının birbirleriyle nasıl iletişim kuracağını anlatmakta, bir arayüzü tanımlamaktadır. Bu tanımlamadaki amaç ise sunucu ve uygulamaları birbirlerinden net çizgilerle ayırmak ve uygulamaları sunuculardan bağımsız hale getirmek.

   OWIN tanımladığı standart ile uyumlu geliştirilen web sunucuları, IIS gibi kompleks ve pek çok senaryoyu aynı anda destekleyen sunucuları yerine, geliştiricilerin istediği bileşenleri uygulamaların ihtiyaçları doğrultusunda birleştirdiği ve yalın HTTP’nin hemen üzerinde yer alan ince bir katman olarak düşünülebilir. Sadece geliştirici olarak bizlerin ihtiyacı olan modüllerin yüklenmesi beraberinde önemli bir performans kazanımı getirmekle birlikte, aynı zamanda sunucu yüzeyini küçülterek olası saldırıların sayısını da azaltacaktır.

   “Buraya kadar her şey güzel; ama neden sunucu bağımsızlığı? yani, elimizde sadece IIS olduğunu düşünecek olursak?!

   Yukarıdaki satırları okurken eminim ki aklınıza bu soru gelmiştir. Öncelikle elimizde web sunucusu olarak sadece IIS bulunmuyor. Açık kaynak kodlu web sunucularını bir tarafa bile bırakacak olursak, en basitinden, Microsoft bile Visual Studio ile birlikte geliştirme amaçlı bir web sunucu sunmakta. İşin içine bir de Mono’yu kattığımızda resim daha da büyüyecektir. Bunu bir adım daha ileri taşıyalım ve kendi geliştirdiğimiz bir uygulamaya gömülü web sunucu üzerinden sunduğumuz web uygulamalarını da işin içine katalım… Bu durumda geliştirdiğimiz bir uygulamanın alt tarafta yer alan platformdan, web sunucusundan, bağımsız ve modüler olması bizler açısından önemli bir artı olacaktır.

   Bir diğer önemli noktada da şu ki web olabildiğine hızla gelişmekte. Bu hızlı gelişme karşısında toplulukların geliştirdiği projelerin ve sunucuların ortak bir arayüze sahip olması beraberinde getirdiği modüler mimari ile hem projelerin hem de sunucuların öne çıkmasında faydalı olacaktır. Bu da tüm paydaşlar için tam bir kazan-kazan ortamı sunacaktır.

   Bu uzun girişten sonra umuyorum ki OWIN standardını/konseptini kafanızda biraz olsun netleştirebilmişimdir. Şimdi sırada temel OWIN konseptlerini tanımada;

OWIN katmanları

 

   OWIN, temelde host, server (sunucu), middleware (katmanlar) web frameworks (web yapıları) ve web application (web uygulaması) rolleri etrafında toplanmıştır;

  • Host : Uygulamayı başlatmaktan sorumlu olan süreç/yapıdır. IIS gibi bazı web sunucuları hem host hem de server rollerini üstlenmektedirler.
  • Server (Sunucu) : İstemcilerle HTTP üzerinden doğrudan iletişim içerisinde olan yapıdır. Sunucu rolü HTTP protokolü üzerinden gelen isteklerin takip eden rollerce işlenmesinden ve çıktının istemciye iletilmesinden sorumludur.
  • Middleware (Katman) : Sunucu ile uygulama arasında yer alan ve denetleme, yetkilendirme, doğrulama, yönlendirme v.b. özel işlemleri gerçekleştiren rollerdir.
  • Web Frameworks (Web Yapıları) : Web uygulaması geliştirme sırasında gerçekleştirilen ortak işlerin daha hızlı ve kolay gerçekleşmesinden sorumlu rollerdir.
  • Web Application (Web Uygulaması) : OWIN uyumlu sunucularda ve web yapıları üzerinde özel bir amaç için geliştirilmiş uygulama rolleridir.

   OWIN uyumlu mimarilerin yukarıda sıraladığım rolleri desteklemesi gereklidir.

   Bu rollere örnek verdiğimizde ise karşımıza aşağıdaki gibi bir tablo çıkacaktır;

OWIN-Layer-Details

 

   Durup büyük resme baktığımızda ortaya çıkan bu modüler yapı sayesinde geliştirdiğimiz uygulama için en uygun mimariyi aynı lego parçalarını birleştirir gibi oluşturarak platform bağımsız bir şekilde sunma şansına sahip oluyoruz. Bir yazılım geliştirici olarak geliştirme aşamasında örneğin bir yetkilendirme için endişelenmek yerine sadece uygulama mantığımızı iyi kurgulamaya odaklanıyoruz…

   Ok, OWIN projesini teorik olarak bu kadar tanımak sanırım yeterli olacak. Şimdi sıra geldi ellerimizi biraz koda bulaştırmaya…

   OWIN standardını incelediğinizde oldukça sade bir mimarisi olduğunu göreceksiniz. 3.1 Application Delegate başlığı altında birincil yapı taşı olan ve bundan sonra da sıkça göreceğiniz aşağıdaki delegate tanımı yer almaktadır;

using AppFunc = Func<
       IDictionary<string, object>, // Environment
       Task>; // Done

   Anahtar-Değer ikililerinden oluşan bir veri sözlüğü ve işlem yapacak olan bir görev nesnesi…

   Genişletilebilir bir yapıda tanımlanmış olan ve OWIN’in temel taşlarından ilki olan veri sözlüğünün sahip olması gereken minimum seti yine OWIN standardı 3.2 Environment başlığı altında belirtilmiştir. Gelen istek ve sunucu hakkında önemli bilgilerin bulunduğu ve OWIN içerisinde temel bileşenlerin tanımlı olduğu bu sözlük, isteğin işlenmesinde önemli bir girdi olduğu kadar katmanlar arasında veri iletimi içinde olmazsa olmaz bir bileşendir. Örneğin yetkilendirme katmanında kullanıcının sahip olduğu roller tespit edilerek bu sözlük içerisine atılabilir ve bu bilgi diğer katmanlarcada işlenerek kullanıcı rollerine uygun arayüzlerin gösterilmesi sağlanabilir. Bu tasarım aynı zamanda bileşenlerin birbirinden bağımsız olarak geliştirilebilmesine de olanak vermektedir.

   Yukarıda ilettiğim AppFunc delegate’inde yer alan task ise veri sözlüğü ile iletilen bu verileri kullanan ve katmanın iş mantığının yer aldığı fonksiyonu belirtmektedir. Task tanımlaması sayesinde bütün sistem asenkron olarak çalışma gibi önemli bir yeteneğe sahip olarak daha yüksek bir kapasite sunabilecektir.

   Şimdi işe koyulma zamanı, hadi Visual Studio’larınızın başına…

   İşe bir sınıf kütüphanesi projesi oluşturmakla başlayalım;

OWIN-New-Project

     Projemiz açıldıktan sonra class1.cs dosyasını IsMantigi.cs adıyla yeniden adlandırarak içeriğini aşağıdaki şekilde yapalım;

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

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

    public class IsMantigi {
        private readonly AppFunc birSonrakiKatman;

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

            this.birSonrakiKatman = birSonrakiKatman;
        }

        public Task Invoke(IDictionary<string, object> environment) {
            System.Diagnostics.Trace.WriteLine("İstek iş mantığınca işleniyor");

            return birSonrakiKatman(environment);
        }
    }
}

   İşte bu kadar.. İlk OWIN katmanımızı (middleware) yazdık bile… Fark ettiyseniz Invoke fonksiyonu daha önce sizlere belirttiğim AppFunc delegate’iyle aynı imzaya sahip. Yani veri sözlüğü bu fonksiyon tarafından kabul edilerek ilgili iş mantığınca işlenecek. Sözlük iş mantığı neticesinde düzenlendikten sonra işlenmesi için bir sonraki katman tetiklenecek. Dikkat ederseniz sınıfımız ilklendirilirken tetiklenecek bir sonraki katman da parametre olarak verilmekte. OWIN mantığını anlayabilmeniz adına kodu olabildiğince sade tutarak sadece iş mantığının işlendiğine dair bir log yazdırdım. Gerçek hayatta bu satırların yerinde gerçek iş mantığı kodları olacaktır.

   Şimdi, geldiğimiz noktada ilk kodlarımızı yazdık; ama ortada hala elle tutulur bir şey yok! Bunun sebebi yazdığımız bu middleware kodunun üzerinde çalışacağı bir barındırıcı, sunucu hatta bir web uygulaması bulunmaması.

   Bu sebeple sıra test yapabileceğimiz basit bir web uygulaması oluşturmakta. Bunun için solution içerisine yeni bir web projesi oluşturalım. Benim tercihim basit olması adına boş bir MVC projesi oldu;

MVC-Web-Project

Empty-MVC-Web-Project

   Aslında bu proje için illaki bir boş MVC projesi oluşturmamıza gerek yoktu, bir sınıf kütüphanesi projesi de işimizi görebilirdi. Yine de ilerleyen makalelerinde kullanabilmek adına boş MVC projesi ile devam edelim. Yazımın başlarında paylaştığım mimariyi hatırlayın. Barındırıcı ve sunucu için elimizde bir çok farklı seçenek bulunuyor. Bu noktada sunucu için ben tercihimi Microsoft tarafından açık kaynak kodlu olarak geliştirilen HttpListener’dan yana kullanıyorum.  Bunun için boş MVC projemizde aşağıdaki komutlar yardımıyla Owin ve Microsoft.Owin.Host.HttpListener NuGet paketlerini kurmalıyız;

Install-Package Owin
Install-Package Microsoft.Owin.Host.HttpListener -Pre

Install-Package-Owin

   Hatırlarsanız OWIN bir standart demiştik; peki OWIN NuGet paketi nereden çıktı?!

  Aslında bu paket içerisinde sadece IAppBuilder arayüzü bulunan ve OWIN topluluğunca yönetilen olabildiğine sade bir paket.

   Şimdi oluşturduğumuz boş MVC projesinde startup adıyla bir sınıf oluşturup içerisine aşağıdaki kodları ekleyin;

using Owin;

namespace Enterprisecoding.MerhabaOWIN.Web {
    public class Startup {
        public void Configuration(IAppBuilder builder) {
            builder.Use(typeof(IsMantigi));
        }
    }
}

  Tabi bu kodun derlenebilmesi için IsMantigi sınıfımızın bulunduğu projeyi referanslara eklememiz şart 😉

  Startup sınıfı ve içerisindeki Configuration fonksiyonu, detaylarını makalemin devamında bulabileceğiniz şekilde, barındırıcı (host) uygulama tarafından tespit edilerek yapılandırma sırasında kullanılacaktır. owin.dll’i içerisinde yer alan ve Configuration fonksiyonuna parametre olarak geçilen IAppBuilder yardımıyla barındırıcının az önce oluşturduğumuz IsMantıgı katmanını (middleware) kullanmasını istiyoruz.

   Başından beri gördüğünüz gibi OWIN mimarisi olabildiğine basit tasarlanmıştır. Doğal olarak bu basitlik ilkesini kendisini yapılandırma sırasında göstermekte. Pek çok OWIN yapısı başlarken içinde bulunduğu dizinde yer alan assembly’leri tarayarak Startup olarak adlandırılmış sınıfları ve bu sınıflar içerisindeki sadece IAppBuilder parametresini kabul eden Configuration fonksiyonunu arayacaktır. Bulunan sınıf ilklendirilir ve içerisindeki Configuration fonksiyonu ilgili parametre ile tetiklenir.

  Geldiğimiz noktada büyük resme dönüp baktığımızda katmanımız (middleware), web uygulamamız (web application), sunucu (server) rolleri hazır durumda. Web yapıları (Web frameworks) rolünün seçimli olduğunu düşünecek olursak geriye barındırıcı (host) kalıyor. Bu noktada elimizde pek çok farklı seçenek olmakla birlikte ben tercihimi Microsoft tarafından açık kaynak kodlu olarak geliştirilen Katana projesinden yana kullanacağım.

   Katana’yı kurmanızın en hızlı yolu bir önceki makalemde sizlerle paylaştığım Chocolately’i kullanmak. Detaylarını önceki yazımda bulabileceğiniz Chocolatey sisteminize kurulduktan sonra tek yapmanız gereken aşağıdaki basit komut ile Katana’yı sisteminize kurmak;

cinst Katana –pre

  Bu adımlar ardından projemizi derleyerek komut satırından çıktı klasörüne gidelim. Çıktı klasöründe Katanayı aşağıdaki parametrelerle çalıştırmamız yeterli olacaktır;

katana -p5000 -v

   Katana’ya verdiğimiz –p5000 parametresi 5000 nolu soketin kullanılacağını, –v parametresi ise ayrıntılı loglama modunda başlatılacağını belirtmekte. Ardından bir browser üzerinden http://localhost:5000/ adresini açtığımızdaaaa… 404 hatası alacaksınız 😀 neden şarşırdınız ki? sonuçta yanıt için herhangi bir şey yapmadık, sadece logladık.. Dolayısıyla yanıt olarak 404 alsak bile konsolda aşağıdaki log’u göreceğiz 😉

Katana konsol çıktısı

 

   Dikkat ederseniz katana’ya sunucu olarak ne kullanması gerektiğini de söylemedik. Microsoft.Owin.Host.HttpListener.dll’i otomatik olarak çıktı klasörüne kopyalanacaktır. Katana’da aksi belirtilmediği sürece Microsoft.Owin.Host.HttpListener’ı kullanmak üzere yapılandırılmıştır. Büyük resimde, Katana pek çok OWIN rolünü bir araya getiren bir tutkal görevi gördü.

  Alışkın olduğumuz gibi projemizi F5’e basıp hata ayıklama oturumunu başlatmak farklı bir yöntem takip ettik. Bu durum yoğun geliştirme süreçlerinde tabi ki sıkıntı doğuracaktır. Bu sebeple aşağıdaki adımları takip ederek F5’e basarak bu sürecin otomatik başlamasını ve hata ayıklama oturumunun açılmasını sağlayabilirsiniz;

   Öncelikle oluşturduğumuz boş MVC projesi başlangıç projesi olarak ayarlanmalı. Ardından bu projenin ayarlarından web segmesine gelerek “start external program” seçeneği seçilmeli ve Katana.exe’nin bulunduğu klasör, –p5000 –v parametresi ve projenin çıktı klasörü belirtilmelidir;

Visual-Studio-Start-External-Program

 

   Bu kadar basit…

   Makalemin sonunda, geldiğimiz noktaya dönüp bakacak olursak; IIS’ten bağımsız olarak ve en basit haliyle bir web uygulaması geliştirdik. Bu uygulamamızdan bağımsız olarak hizmet veren bir iş mantığı oluşturup sunucuya her istek geldiğinde çalıştırılabilmesini sağladık. Üstelik tüm bunları bir konsol uygulaması üzerinden son kullanıcıya sunduk. İşin güzel yanı tüm bunları bir kaç değişiklik ile kendi geliştirdiğimiz bir konsol uygulaması, IIS ya da Mono sayesinde Linux üzerine kurulu bir web sunucu üzerinden sunmamız da mümkün.

   Üstelik bu OWIN’in bize sunduğu şeylerden yalnızca birisi. Farklı farklı toplulukların ve geliştiricilerin OWIN katmanları geliştirdiğini düşünecek olursak yakın zamanda OWIN desteği sunan web sunucularının oldukça avantajlı duruma geleceğini söylemek mümkün.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, 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# konusundan Microsoft tarafından dört 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+

3 yorum

  1. Arda   •  

    Ellerinize sağlık.. Güzel ve açıklayıcı olmuş

  2. hasan   •  

    Teşekkürler , harika bir başlangıç yazısı.

  3. arif emre   •  

    Gerçekten güzel ve akıcı bir makale olmuş…Teşekkür ederim..

Bir Cevap Yazın

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