İçeriğe geç

Asp.Net Core MVC Middleware Kavramı

Asp .Net içinde modules, handlers ve web.config gibi kavramlar vardı ve şimdi .Net Core tarafında ise Middleware kavramı yer almakta. Middleware yapısı, uygulamamızın HTTP isteklerine nasıl tepki vereceğini denetleyen bir yapıdır diyebiliriz. Örneğin bir hata durumunda neler yapılacak, kullanıcı kimliği doğrulaması yapılmış mı, belirli statik dosyalara erişim olacak mı… gibi örnekleri çoğaltmak mümkündür.
 
Middleware işlemleri uygulamamızın Startup sınıfı içinde yapılandırılır ve şimdi bu kısmı detaylı şekilde inceleyelim.
 
Startup Class (Uygulama Başlatma Süreci)
Startup sınıfı içinde ConfigureServices ve Configure isminde metotlar görürüz. ConfigureServices isimli metot üzerinde MVC’nin kendisi de dahil olmak üzere uygulamamızın kullanacağı hizmetleri tanımlarız. Sonrasında Configure metodu işlem görür ve bu kısımda middleware tanımlamalarını gerçekleştirebiliriz. IApplicationBuilder interface içinde aşağıda da göreceğiniz üzere Use metodu yer almakta.

Middleware için halihazırda aşağıdaki gibi sınıflar mevcuttur. Microsoft middleware yapılandırması için use ön takısı(prefix) kullanmış ve bizler de şayet custom middleware hazırlarsak başına use ön takısını kullanmamız daha iyi olabilir.

Bir request ile etkileşime geçmek için 3 tane metot vardır. Bunları aşağıdaki gibi inceleyebiliriz.

  • Use
  • Run
  • Map

 
Use
Pipeline ile etkileşim kurmak için en çok kullanılan yöntem budur. Bu yöntem size aşağıda da göreceğimiz üzere next isminde bir delegate sunar ki siz bununla bir sonraki middleware üyesine erişim sağlayabilirsiniz. 2 middleware nesnesinin arasına girip kodlama yapmak amaçlı kullanılabilir.

            app.Use(async (context, next) =>
            {
                Debug.WriteLine("Use Middleware (Begin)");
                await next.Invoke();
                Debug.WriteLine("Use Middleware (End)");
            });

            app.Run(async context =>
            {
                Debug.WriteLine("app.Run");
                await context.Response.WriteAsync("Response");
            });

Bu durumda output olarak göreceğimiz sıralama aşağıdaki gibi olacaktır.


– Use Middleware (Begin)
– app.Run
– Use Middleware (End)

 
Run
Bu metot ile pipeline üzerinde short circuit(kısa devre) yapmak mümkündür. Kod bu metoda düştükten sonra pipeline üzerindeki diğer işlemler devam etmez. Bunu aşağıdaki kod ile test etmek mümkündür.

            app.Run(async context =>
            {
                await context.Response.WriteAsync("Response 1");
            });

            app.Run(async context =>
            {
                await context.Response.WriteAsync("Response 2");
            });

Buradaki kod bloğunda Response 1 yazısının ekrana yazıldığını ve diğer run metoduna düşmeden short circuit(kısa devre) olduğunu görebiliriz.

 
Map
Bu yaklaşım ile adından da anlaşılacağı üzere bir path yakalamak istediğimiz durumlarda kullanırız. Örneğin product isimli map için bir iş mantığı yerleştirmek istediğimizde aşağıdaki gibi bir yol izleyebiliriz.

            app.Map(new PathString("/product"), _configuration =>
            {
                _configuration.Run(async context =>
                {
                    await context.Response.WriteAsync("Response");
                });
            });

Custom Middleware
Şimdi var olan middleware nesnelerinin harici olarak kendimiz bir middleware nesnesi hazırlayıp bunu Startup sınıfı içindeki Configure metodu içinde kullanacağız. Hazırlayacağımız middleware nesnemiz içinde iş mantığı olmayacak. Sadece kendimiz nasıl middleware hazırlayabiliriz sorusu üzerine duracağız.

 

Öncelikle RequestDelegate nesnemiz ile bir sonraki pipeline nesnesine erişim sağlayacağımız için instance oluşturuyoruz. Aynı zamanda bütün pipeline nesneleri içinde invoke isimli metot bulunması gerekmekte. Bu sebeple HttpContext parametresi alan bir Invoke metodu hazırlıyoruz ve içine ihtiyaç duyacağınız bir iş mantığı yerleştirebilirsiniz. Temel olarak sınıfımız aşağıdaki gibi olacaktır.

    public class SampleMiddleware
    {
        private readonly RequestDelegate _next;

        public SampleMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            // İş mantığı...
            await _next.Invoke(context);
        }
    }

Hazırlanılan bu middleware nesnesini register etmek için Startup sınıfında bulunan Configure metodu içinde aşağıdaki gibi belirtebiliriz.

        app.UseMiddleware<SampleMiddleware>();
Tarih:ASP .NET Core

2 Yorum

  1. Thanks, brother, this is a great article…

  2. ismail ismail

    Güzel, sade ,anlaşılır bir yazı olmuş

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.