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ı
1
Facebook
Son Yorumlar