Middleware Nedir?

Mustafa Onur Taşdemir
5 min readJun 19, 2021

Merhaba arkadaşlar bu yazımda, Middleware yapısı hakkında dilim döndüğünce bilgiler vereceğim.

Middleware Cycle

Öncelikle tanımından başlamak gerekirse, basit haliyle Middleware ara yazılım demektir. Basit bir web uygulamasında, istemciden gelen request’e karşılık olarak response gönderilmektedir. Gelişmiş web uygulamalarında ise, istemci bir request isteğinde bulunduğunda gelecek olan response’un arasına girerek bir işlem yaptırmak isteniliyorsa bu işlemlere Middleware denir.

Middleware Cycle

Birden fazla middleware’in çalışma mantığına bakacak olursak, yukarıdaki görselde görüldüğü gibi sarmal bir şekilde tetiklenirler. Bir Middleware işleme girdiği zaman sona ermeden başka bir middleware’i tetikleyebilir. Tetiklediği middleware işlemini sonlandırdıktan sonra kendi işlemini sonlandırır. Bu şekilde sarmal bir yapı ortaya çıkmış olur.

Peki Middleware Nerelerde Kullanılabilir?

  • Yönlendirme: Yönlendirme uygulanmak isteniliyorsa,
  • Kimlik Doğrulama: Kullanıcının kimliği doğrulanmak isteniliyorsa,
  • Yetkilendirme: Belirli bir kaynağa erişim sağlamak için yetkilendirme isteniliyorsa,
  • Log: İşlem sırasında istek ve yanıt günlüğe kaydetme isteniliyorsa,

Yukarıda ki işlemler yapılmak isteniliyorsa, uygulamalarda Middleware kullanılabilir.

Middleware Metotları

  • Run(): Request bu metoda düştükten sonra pipeline üzerindeki işlemler devam etmez, bir nevi kısa devre oluşturur. Dolayısıyla kullanıldığı yeden sonraki middleware tetiklenmeyeceğinden dolayı akış kesilecektir.
  • Use(): Bu metot ile bir sonraki sırada olan middleware üyesine erişim sağlayabiliriz. Run metodunun aksine iki parametre almaktadır. Bunlar context ve task parametresidir. Task parametresi kendisinden sonra çalışacak olan middleware’in çalışmasını bekler ve o bittikten sonra kendini tamamlar.
  • Map(): Map metodu, Middleware’i belirli URL’ye eşlemek için kullanılır.

Middleware Kullanımı

Middleware’i gösterebilmek için basit bir loglama işlemi yapalım. Bir Web API projesi açalım. Proje içerisine “LoggingMiddleware” adında bir class oluşturuyoruz. Class içerisinde RequestDelegate nesnesini parametre olarak alan bir constructor oluşturduk. Bu nesne gelen request’i handle etmemizi sağlayacak ve gerekli işlemler yapıldıktan sonra HttpContext ile birlikte Request/Response Pipeline’ı üzerinde request’in hayatına devam etmesini sağlayacaktır.

Aşağıda görüldüğü gibi InvokeAsync metodu, middleware’lar çağrıldığında execute edilecek olan metotdur. Bu metot, uygulamaya gelen request’e ve oluşturulan response’a müdahale edebilmemizi sağlar. Biz de burada senaryo gereği Request ve Response üzerinden gerekli bilgileri alıp bir log kaydı oluşturduk.

LoggingMiddleware

Sonrasında LoggingMiddlewareExtension adında bir class daha oluşturup, IApplicationBuilder tipinde yeni Extension metotudu tamamlamış olduk.

LoggingMiddlewareExtension

Daha sonrasında Startup içerisinde Register ederek, senaryoyu tamamlamış oluyoruz.

Startup

Web API projesi oluşturulduğunda, default olarak WeatherForecastController class’ı gelmektedir. Testlerimiz için bu endpoint’i kullanacağız. Loglara baktığımız zaman “/WeatherForecast” endpoint’ine başarılı bir istekte bulunulduğu görmekteyiz. Sonrasında ise “/WeatherForecast/2” endpoint’ine bir istekte bulunulduğunda böyle bir endpoint’in olmadığı için 404 değerini dönmektedir.

log.txt

Bu şekilde bu senaryoyu başarılı bir şekilde tamamlamış bulunmaktayız. Projenin kaynak kodlarına buradan ulaşarak diğer işlemlerin de nasıl yapıldığına bakabilirsiniz.

Başka bir örnek verecek olursak, bu Exception Handling olabilir. Örneği açıklayacak olursak, projemizin herhangi bir bölümünde oluşmuş bütün exception’ları sadece tek bir metot üzerinden yakalamaya çalışarak yönetmeye çalışacağız.

Bir Web API projesi açıyoruz ve default olarak gelen WeatherForecastController’ı içerisinde bir hata olduğu zaman aşağıda görüldüğü gibi hata detayını göremiyoruz ya da bu hatayı handle edemedik.

Bu hatayı handle edebilmek için aşağıda görüldüğü gibi bir try catch koyabiliriz. Hata olarak basit bir exception fırlatıyoruz, o hatayı başka bir şey olarak düşünebilirsiniz. Mesela başka bir class içerisinde bir metodu çağırdınız orada hata oldu veya veritabanına bağlanmaya çalıştığınız zaman bir hata oldu, herhangi bir hata olarak düşünebilirsiniz. Burada ki hatayı try catch sayesinde yakalamış olduk.

Peki Controller’ımızda birden fazla metodumuz olduğu zaman ne olacak? Bu metotlar içerisinden başka metotlar çağrılabilir. O zaman bu her metot için try catch yazmak zorunda olmamalıyız. Yazarsak eğer kendimizi tekrar etmiş oluruz ve SOLID prensiplerine bağlı kalmamış oluruz. Yazılım konusunda önemli kısaslardan biri olan Don’t Repeat Yourself(DRY)! Kendini tekrar etme. Bu yüzden bunların tamamını yönetebilmek için Middleware kullanabiliriz.

Parametre olarak yine RequestDelegatei alıyoruz. RequestDelegate, request oluştuğu zaman o request’in bütün verilerine,objelerine gibi ulaşabileceğimiz .NET Core tarafından yönetebileceğimiz objedir. Şimdi asenkron olarak geriye Task dönen bir metot yazıyoruz. Bu arada asenkron olarak kullanmayadabilirsiniz ama .Net Core’da ki asenkron yapısını kullanmanız lazım çünkü aynı anda gelen isteklerin handle edilmesinde oldukça başarılıdır.

Bu Middleware’in çalışabilmesi için Startup içerisinde Dependency Injection yardımı ile eklemek gerekiyor.

Artık bir istek geldiğinde başta Controller’da yazdığımı try catch düşmek yerine yazdığımız Middleware’e gelecek Invoke metodu tetiklenecek. Dolayısıyla bu Invoke işlemi içerisinde bir exception oluşursa bunu yakalamak için burada try catch yazmamız yeterli olacaktır. Bu Invoke içerisinde bulunan try catch bloğu uygulama içerisindeki tüm try catch’leri yakalayacak anlamına gelmektedir.

Yukarıda ki görselde görüldüğü gibi Middleware içerisinde exception hatasını yakalamış olduk. Dolayısıyla uygulamada herhangi bir Controller içerisinde hata oluştuğu zaman burada yakalayabiliyoruz anlamına geliyor.

Bir Middleware’in içerisin Invoke metodu ekleyerek Web API içerisinde ki handle edilmemiş tüm exception’ları bir try catch kullanarak handle etmiş olduk. Middleware’in güzel yanlarından biri de budur.Projenin kaynak kodlarına buradan ulaşabilirsiniz.

Bu makalede Middleware hakkında bilgiler vermeye ve basit birkaç Middleware örneği gerçekleştirmeye çalıştım. Bir sonraki makalede görüşmek üzere arkadaşlar :).

https://www.mshowto.org/asp-net-core-middleware-bolum-1.html

--

--