Asp.Net Core ‘da Middleware Yapısı
Selamlar,
Bu makalede Asp.Net Core’da Middleware yapısını inceliyor olacağız. Herhangi bir senaryomuz olmadan tamamen middleware’ın ne olduğunu anlamaya çalışacağız.
Asp.Net Mvc ile uygulama geliştirmiş geliştiricilerin bu yapıya çokta yabancı olmadığını söyleyebiliriz. Asp.Net Mvc tarafında middleware yapılarına benzer olarak Filters‘ları verebiliriz. Filterlarda ki amaç bir uygulamada parça işler üretmek ve bazı işlemler gerçekleşmeden önce yada gerçekleştikden sonra araya girerek öncesine bazı işlemleri gerçekleştirmek için kullanılır. Middleware yapılarında da amaç tamda budur. Hadi gelin bu örnekten sonra Middleware yapılarını tanıyalım ve örneklendirmeye çalışalım.
NOT:Yukarıda ki örnek Asp.Net Mvc’den Asp.Net Core’a geçiş yapan geliştiricelerin gözünde birşeylerin daha net canlanması için verilmiştir.
Middleware Nedir?
Middleware ,Request ile Response arasına girerek uygulamamızın istekler karşısında nasıl tepki vereceğini belirleyen yapılardır. Middleware’lar uygulama açılırken pipeline’nin hangi sıraya göre
işleneceğini belirler.Bu sebeble uygulamamıza eklenecek middleware’ların sırası oldukça önemlidir.Çünkü middleware’lar eklenen sıraya göre çalışmaktadır.
Yukarıdaki şekilde görüleceği üzere istek ilk olarak Middleware1‘e gelir. Middleware1‘de Next(); metodunu görene kadar buradaki işlemleri yapar Next(); metodunu görünce bir sonraki Middleware’a geçer. Middleware2 çalıştırılır ve Next(); metodu görene kadar buradaki işlemler yapılır. Next(); görünce Middleware3 geçer ve son olarak buradaki işlemleri yapar. Geri dönüşte ilk olarak Middleware2 de başka işlem varsa onu gerçekleştirir.Sonra Middleware1 bakar burada işlem varsa onuda bitirip kullanıcıya dönüş yapar.
Daha önce kaleme aldığım .Net Core Nedir? makalesinde .Net Core mimarisinde bütün yapılandırmaları startup içerisinde yaptığımız söylemiştik.
Configure(); ve ConfigureServices(); metodlarının işlevlerine de oradan detaylıca değinmiştik. Bu konuda eksikleriniz varsa buradan ulaşabilirsiniz. Projemizi oluşturduğumuzda yukarıdaki görseldeki gibi default olarak bazı servisler ve middleware’lar hazır eklenmiş olarak gelir. Bizde hem mevcut middileware’ları kullanırken hemde custom yazdığımız middleware’ları startup dosyası içerisinde tanıtıyor olacağız.
USE Metodu
Uygulamamıza middleware eklerken en çok kullanılan yöntemlerden birisidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.Use(async (context, next) => { await context.Response.WriteAsync("Use Bloğu 1, Sonuç 1"); await next(); await context.Response.WriteAsync("Use Bloğu 1, Sonuç 1"); }); app.Use(async (context, next) => { await context.Response.WriteAsync("Use Bloğu 2, Sonuç 1"); await context.Response.WriteAsync("Use Bloğu 2, Sonuç 2"); }); } |
RUN Metodu
Middleware’lar arasında kısa devre yapma özelliği gösterir.Bu middleware çalıştığı zaman bu komut içerisinde ki işlemler yapılır ve uygulama son bulur.
1 2 3 4 5 6 7 8 9 10 11 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.Run(async context => { await context.Response.WriteAsync("Run Metod"); }); app.Run(async context => { await context.Response.WriteAsync("Run Metod"); }); } |
MAP Metodu
Uygulamamızda bir path yakalamamız gerekiyorsa bu metodu kullanırız.Gelen request’de gelinen url’e göre bu metoda girer ve bu metod içerisindeki kod bloğu çalışır.
1 2 3 4 5 6 7 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.Map("/Home", map => { map.Run(async context => { await context.Response.WriteAsync("Home adresi üzerinden gelindi"); }); }); } |
MAPWHEN Metodu
Gelen request’de koşul tanımlamak için kullanılır. Eğer bu koşul sağlanırsa bu metod içerisinde ki kod bloğu çalışır.
1 2 3 4 5 6 7 8 9 10 11 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.MapWhen(x => x.Request.Method == "GET", mapWhen => { mapWhen.Use(async (context, next) => { await context.Response.WriteAsync("HTTP GET isteğinde bulunuldu"); await next(); }); }); } |
Şuana kadar .Net Core içerisinde hazır olarak gelen ve middleware eklenirken kullanılan yöntemleri inceledik.Projenin oluşturulması aşamasında default olarak gelen app.UseHttpsRedirection();,app.UseStaticFiles();,app.UseRouting();,app.UseAuthorization(); ek olarak daha bir çok hazır middleware’ı ihtiyacımıza yönelik kullanabiliriz.
Custom Middleware Yazmak
Şimdi custom bir middleware yazarak bu middleware’ı nasıl IApplicationBuilder sınıfı içerisine ekleyip startup içerisinde nasıl çağırabiliriz onu inceleyeceğiz.
NOT: Configure(); metoduna dikkat ettiyseniz IApplicationBuilder türünde bir parametre almaktadır ve Configure(); metodu içinde middleware yapılandırmalarını bu parametre tipi üzerinden gerçekleştirmekteyiz. .Net Core içerisindeki hazır middleware’ları içerisinde barındıran sınıftır diyebiliriz.
Örnek:Uygulamamamıza gelen tüm isteklerin zamanları bir text dosyasına kayıt eden middleware yazalım ve her request’de middleware’ın nasıl araya girerek işlemleri gerçekleştirdiğini daha iyi anlayalım.
RequestTimeMiddleware.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class RequestTimeMiddleware { readonly RequestDelegate _next; public RequestTimeMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { File.AppendAllText("time.txt", DateTime.Now.TimeOfDay.ToString() + Environment.NewLine); await _next(context); } } |
InvokeAsync(); metodu ile gelen requestler dinlenir ve her request anında time.txt dosyasına request’in anlık time değeri yazılır.
RequestMiddlewareExtension.cs
1 2 3 4 5 6 7 | public static class RequestMiddlewareExtension { public static IApplicationBuilder UseRequestTime(this IApplicationBuilder builder) { return builder.UseMiddleware<RequestTimeMiddleware>(); } } |
Yazmış olduğumuz middleware’ı extension metod yardımı ile IApplicationBuilder sınıfı içersine ekliyoruz. Bu noktadan sonra tek yapmamız gereken startup içerisinde Configure(); metodu içerisinde çağırmak olacak.
Middleware Çağırımı
1 2 3 4 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRequestTime(); } |
Son olarak yazmış olduğumuz custom middleware’ı startup içerisinde bulunan Configure(); metodu içerisinde çağırıyoruz.
Son görselimizi incelediğimizde middleware’ımız sorunsuz bir şekilde çalışmakta ve request ile response arasına girerek o anki request time değerini time.txt yazarak işlemi tamamladı.
Geldik bir makalenin daha sonuna. Umarım faydalı bir yazı olmuştur. Bir başka makalede görüşmek üzere. Hoşçakalın 🙂
Teşekkür ediyorum