.NET 6 ile Middleware temelleri
HTTP üzerinden veri aktarılan bir ortamda verinin aktarılması olayı, bir istek(request) ve onun sonucu(response) üzerinden gerçekleşebilir. İsteği yapan tarafta, bir tarayıcı, telefon uygulaması, başka bir servis veya bilmediğimiz bir şey olabilir ve isteği karşılayan genelde bir servis, sunucuda çalışan bir uygulama olur ve bunun isteği işleyip yanıt dönmesi beklenir.
Middlewarelar request ve requestin gideceği nokta arasında bir ara yazılım, kod bloğudur. Requestte bulunan verilere göre bazı mantıksal kararlar vermek, requestin hedefe ulaşıp ulaşamayacağına(authentication/authorization) karar vermek, log tutmak ve response’u kolaylıkla manipüle edebilmek gibi olanaklar sağlar. Aşağıda bir request ve response akışının middleware’lerden geçişini görsel olarak görebilirsiniz.
Birden çok middleware’den oluşan bir yapı kurulabilir. Request’i bir pipeline’dan geçirip, pipeline’ın sırasında işleyebilirsiniz. Bir request, response oluşumuna ulaşana kadar middleware’lara (veya middleware tarafından çağrılan başka kodlara), oluşturduğunuz düzende ardışık olarak uğrar ve request bir süzgeçten geçer, en sonunda ise uğradığı middleware’leri sondan başa doğru takip ederek response’u iletirsiniz.
İşlenen request Middleware 1'deyken devam etmeyip, Middleware 2 veya 3'e geçmemesini sağlayarak response aşamasına geçebilirsiniz. Yani her middleware’in kendinden sonra gelen diğer middleware’e request’i iletme sorumluluğu kendisindedir.
Middleware ne için kullanılır?
Bir domain’e ait olmayan işler veya isteklerin bir çoğunda gerçekleşmesi gereken işlemler için kullanılır. Yaygın kullanımlardan örnek vermek gerekirse, authentication/authorization(kimlik doğrulama/yetkilendirme), requestlere ve responselara bağlı olarak herhangi bir şeyleri loglamak.
Loglama ile alakalı bir örnek isterseniz şu yazıya bakabilirsiniz: Web Sunucusunun Aldığı İstekleri Ne Kadar Sürede İşlediğini Kafka ve Go ile Kaydetme
Program.cs
Dotnet 6'da ‘dotnet new web api’ komutu ile oluşturulmuş Web API’nın default Program.cs dosyasına göz atalım
Bu dosya oluşturduğumuz yeni Web API uygulamasının requestlerini işlemek için kullandığı pipeline’ı tanımlamamızı sağlıyor. Ayrıca, oluşturacağınız API’nın dökümanı için Swagger ile birlikte geliyor. Aslında varsayılan bir .NET komutu ile oluşturduğumuz bu uygulama halihazırda zaten bazı middleware’leri kullanıyor. Bunlar built-in middleware diyoruz.
Custom bir Middleware
Basit bir middleware implemente edelim, bu middleware bütün response’lara bir mesaj bıraksın.
Run metodu ile aşağıdaki gibi bir kullanım sağlayabiliriz.
Uygulamamızı çalıştırdığımızda şunu göreceğiz:
ASP.NET 6 ile kendi custom middleware’ımızı implemente ettik, fakat bu middleware bütün response’lara bu mesajı yazan bir middleware.
Run, Use ve Map metotları
Program.cs dosyasına göz atarken middleware’leri ardışık bir düzende tutmak için kullanılan metotların Run, Use ve Map metotları olduğunu göreceksiniz. Bunlar Dotnet 6 için en yaygın metotlardır.
Run
Run metodu pipeline düzenimizde o noktada bir middleware çağırır. Fakat dikkat edilmesi gereken bir şey vardır, Run oluşturduğumuz pipeline düzeninde bitişi simgeler ve son çalışacak middleware budur. Run’dan sonra çalıştırılan herhangi bir middleware veya kod bloğu olamayacaktır.
Use
Use metodu bir middleware eklemek için en sık kullandığımız metoddur. Bu metod da pipeline’a bir middleware ekler ve Run metodunun aksine kendinden sonra gelecek middleware veya başka bir öğeye geçişi sağlamaya yardımcı olabilir.
Map
Map metodu aslında üzerinden çokca durmamız gereken bir metotdur, bahsettiğimiz pipeline’i dallandırmaya, yani gelen requestleri adreslememize yardımcı olur.
Middleware’lar pipeline oluşturmamızı sağlayan kod bloklarıdır. Bu pipeline ile gelen request ve gidecek response’ları işleriz ve bu pipeline’ı Program.cs dosyası ile kendi belirlediğimiz sıra ile oluşturabiliriz.
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0