Asp.Net Core Middleware ve Request Delegate - Nedir, Nasıl Kullanılır?

By Burak TUNGUT - 21.9.2016 - 1 Yorum - Kategori Asp.Net Core

Asp.Net Core'a giriş yapmış ve ardından Application Startup konularına değinmiştik. Bu yazımda ise Asp.Net Core'un temellerini oluşturan Middleware'lara deyineceğim.

Middleware Nedir?

Asp.Net Core pipeline'ını inşaa eden, bir request'in response ile sonuçlanana kadar üzerinde gezdiği her bir component'e Middleware denir. Ne kadar da teorik oldu değil mi :) ?

Aslında Asp.Net'e baktığımızda Handler'ların tam olmasada birer karşılığı diyebiliriz Middleware'lar için. Bir request'in başlaması ile register edilmiş Middleware component'ler tek tek gezilir. Ardından ya sonraki pipeline üyesi üzerinden akışın devam ettirilmesi sağlanır ya da short circuit (kısa devre) yaptırılarak response elde edilir.
Tabi pipeline'da register edilmiş son middleware üzerinde ise short circuit yapmaksızın artık gezilecek başka bir üye kalmadığı için response oluşmuş olacaktır.

Middleware'lar tıpkı Asp.Net Web API'da ki Delegating Handler'larda olduğu gibi russian doll mimarise benzer bir yapı ile çalıştırılır. Bunu Asp.Net Web API ve Mimari Özellikleri kitabımda anlatmıştım. Hatta oradaki diyagramı burada sizler ile de paylaşayım;

 

Asp.Net Core Middleware

 

Aynı mimari Asp.Net Core dökümanlarında aşağıdaki gibi anlatılmıştır; (Kaynak : https://docs.asp.net/en/latest/fundamentals/middleware.html)

 

Asp.Net Core Middleware

 

Request Delegate'ler yani middleware içerisinde kullanacağımız yapılar IApplicationBuilder interface'i içerisindeki Run, Map, Use ve MapWhen methodları kullanılarak konfigüre edilirler. Asp.Net Core içerisinde hali hazırda var olan bir çok Middleware component mevcuttur. Bunlardan bazıları aşağıdaki gibidir;

  1. Error Handler (UseExceptionHandler methodu)
  2. Static File Server (UseStaticFiles methodu)
  3. Authentication (UseIdentity methodu)
  4. MVC (UseMvc)

4. madde de yer alan MVC Middleware'ı biraz ilginç gelmiş olabilir. Çünkü alışkın olduğumuz yapı Asp.Net MVC gibi başlı başına IIS ve Asp.Net üzerine inşaa edilmiş yeni bir framework idi. Fakat MVC, Asp.Net Core ile pipeline'a eklenebilen bir özellik gibi kullanılabilir hale getirildi.

Aslında olması gerekende buydu. Çünkü MVC bir yazılım tasarım deseni diğer bir değiş ile bir yiğidin kendine has yoğurt yiğişi idi :) Burada ise bir özellik niteliği taşıyor.

Örnek Bir Middleware Dizilimi

Visual Studio'larımızı açalım ve MVC template'ini seçerek bir adet Asp.Net Core Web projesi yaratalım. Startup sınıfı içerisindeki Configure methodu aşağıdaki gibi olacaktır;

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Yukarıda göreceğiniz üzere IApplicationBuilder tipine extension olarak yazılmış bir çok method çağırılmıştır. Asp.Net Core'u geliştiren ekip burada bir kültür oluşturmuş diyebiliriz. Middleware component'lerin hepsi için birer registration methodu yazmış ve bunların ismini Use ile başlatırken bunları birer extension method olarak belirlemiştir. 

Bizde yazacağımız Middleware'ler için böyle bir yol izliyor olacağız. Öncelikle yukarıda çağırılan method'lara ve register edilme sıralarının önemine bir bakalım.

Karşımıza çıkan ilk Middleware component UseDeveloperExceptionPage() methodu ile register edilen DeveloperExceptionPageMiddleware oluyor. Fakat dikkat edersek Development enviorment'da isek bu gerçekleştiriliyor. Environment konusuna sonraki makalelerde deyineceğiz.
Bu middleware'i register ederek runtime'da alınan hatalır (response oluşmadıysa) browser'a gösterilmesini sağlayabilirsiniz. Asp.Net'te CustomError'ları kapattığınız zaman karşılaştığınız şeyi gerçekleştirmek için bunu yapmanız yeterli olacaktır.

Devamı

Asp.Net Core Nedir? Ne Gibi Değişiklikler Bizi Bekliyor?

By Burak Tungut - 10.7.2016 - 4 Yorum - Kategori Asp.Net Core

Selamlar herkese!

Bir Ramazan bayramını daha geride bıraktık. Umarım herkes için güzel bir bayram olmuştur. Herkesin geçmiş bayramını kutlamak isterim :)
Beni soracak olursanız sadece 2 gün tatil yapabildim. Asıl tatilimi bir kaç hafta sonraya bırakıyorum.

Bayram tatiline çıkmadan bir kaç hafta önce Microsoft tarafında harika gelişmeler oldu diyebilirim. Uzun zamandır ben ve çoğu meslektaşım Asp.Net 5'in gelişmelerini takip ediyorduk. Hatta kulaklarını çınlatayım Yiğit ile her yeni gelişmeyi şirketin Slack kanalından paylaşıp uzun uzun tartışıyorduk. Sonra bir haber aldık ki "Asp.Net 5 Öldü". Hatta bu başlıkla bazı paylaşımlar yapıldı, Scott Hanselman'ın blog'un da dahi bulabilirsiniz.
Tabi ölen bir şey yok aslında. Sadece bu yeni mimarinin adını değiştirmeye karar vermişler. Artık .Net Core ve Asp.Net Core olarak isimlendireceğiz bu teknolojileri. 

Bu yazımı biraz sohbet havasında geçirmek istiyorum çünkü çok çok detaylı konulara değinmeyeceğiz. Asıl amacım bu yazıda Asp.Net Core'a bir giriş yapmak, ne olup, ne olmadığı hakkında bilgiler verebilmek. Yer yer official dökümanından alıntılar / çevirilerde bulabilirsiniz. Umarım çeviri yapmama çok kızmazsınız :) Giriş niteliği taşıyan bir yazıda ne kadar yaratıcılık beklenir ki :) ?

Asp.Net Core Nedir?

"Evet şimdi kitaplarımızın 18. sayfasını açıp tanımı okuyalım. Kim sesli okumak ister?" tadında bir giriş yapmayacağız tabi ki :)
Asp.Net Core aslında Asp.Net (ve .Net Framework) 'in yeniden dizayn edilerek bir çok konseptin değiştirildiği yep yeni bir teknoloji. Üstelik cross-platform çalışabilmek üzere geliştirilmekte. Diğer bir deyiş ile uygulamalarınızı sadece IIS'te Windows bir makinada host etmek zorunda değilsiniz. İsterseniz Linux'ta hatta Mac'te dahi host edebilirsiniz.

Terimlerde karışıklık olmaması adına şöyle bir not düşmek isterim;

.Net Framework bir uygulama çatısı iken, Asp.Net onun üzerine kurulmuş ve web uygulamaları yapmamızı sağlayan bir teknoloji (ya da framework diye de nitelendirebiliriz)
.Net Core ise tıpkı .Net Framework gibi bir uygulama çatısı iken Asp.Net Core onun üzerine kurulmuş ve yine web uygulamaları yapmamızı sağlayan bir teknoloji.

Halilye karşılaştırmalara yer verdiğimiz noktalarda eğer Asp.Net Core'dan bahsediyorsak karlılaştırdığımız nokta Asp.Net'te ki hali ve .Net Core'dan bahsediyorsakta karşılaştırdığımız nokta .Net Framework olacak.

Asp.Net Core Mimarisi

Asp.Net Core açık kaynak olarak geliştirmekte. Amacı ise Asp.Net'te geliştirebildiğiniz projeleri yine geliştirebilirken IoT ve cloud bazlı projelerinizi daha efektif ve esnek bir şekilde geliştirebilmek. Efektif ve esnek diyorum çünkü hali hazırda var olan .Net Framework ve Asp.Net ile de zaten IoT ve cloud bazlı projeler geliştirebiliyorsunuz. Ancak .Net Core'un getirdiği ve değiştirdiği bazı geleneksel yaklaşımlar sayesinde tüm bunları daha efektif ve esnek yapabiliyor, çok daha performanslı uygulamalar geliştirebiliyorsunuz.

Çünkü Asp.Net Core optimize edilebilir bir mimariye sahip. Asp.Net'e göre karşılaştırdığımızda sadece "Hello World" yazabilmek için dahi onlarca referansa ve System.Web'e bağımlı değilsiniz. Projenizin ihtiyacına göre pipeline'i zenginleştirebiliyor, istediğiniz modülleri NuGet üzerinden dahil edebiliyorsunuz.

Nasıl ki ORM kullanmak istediğiniz bir Asp.Net uygulamanıza NuGet üzerinden EntityFramework'ü referans olarak ekleyebiliyorsanız artık Asp.Net Core ile IIS'in dahi bağımlılığını NuGet üzerinden ekleyebileceksiniz. Daha önce duymadıysanız ilk benden duyun, artık IIS'e bağımlı değilsiniz :)

Official dökümanda bulacağınız bazı kök değişiklikleri aşağıda listeledim. Bir çoğuna ilerleyen yazılarımda detaylarıyla değineceğiz.

Devamı
1
Facebook
Son Yorumlar