ASP.NET Core Middleware Yazma ve Sırası Neden Önemli?
ASP.NET Core'da middleware, HTTP isteğini işleyen ve yanıtı hazırlayan bileşenlerdir. İstek pipeline'ında sırayla çalışırlar ve her middleware bir sonrakine karar verir. Sıra yanlışsa, kimlik doğrulama yapılmadan yetkilendirme kontrol edilebilir veya logging çalışmayabilir.
Middleware, `IApplicationBuilder` üzerinden kaydedilen ve `HttpContext` nesnesine erişen ara yazılımdır. İstek geldiğinde pipeline'da yukarıdan aşağıya doğru çalışır, yanıt ise aşağıdan yukarıya geri döner.
Örneğin, `UseAuthentication()` (kimlik doğrulama) `UseAuthorization()` (yetkilendirme) öncesinde gelmelidir. Aksi halde kullanıcı kim olduğu belli olmadan erişim kontrol edilir ve hata oluşur.
Şu kodu `Program.cs` dosyasına ekle:
1var builder = WebApplication.CreateBuilder(args);2var app = builder.Build();34// Middleware 1: İsteği loglama5app.Use(async (context, next) =>6{7Console.WriteLine($"[LOG] İstek: {context.Request.Path}");8await next();9Console.WriteLine($"[LOG] Yanıt: {context.Response.StatusCode}");10});1112// Middleware 2: Kimlik doğrulama simülasyonu13app.Use(async (context, next) =>14{15var token = context.Request.Headers["Authorization"].FirstOrDefault();16if (string.IsNullOrEmpty(token))17{18context.Response.StatusCode = 401;19await context.Response.WriteAsync("Yetkisiz: Token gerekli");20return; // Devam etme, yanıtı gönder21}22context.Items["User"] = "admin"; // Kullanıcı bilgisini sakla23await next();24});2526// Middleware 3: Endpoint27app.MapGet("/", (HttpContext context) =>28{29var user = context.Items["User"]?.ToString()?? "Bilinmiyor";30return $"Hoşgeldin, {user}!";31});3233app.Run();Çalıştırma:
1dotnet runTest et:
1# Token olmadan2curl http://localhost:5000/3# Çıktı: Yetkisiz: Token gerekli45# Token ile6curl -H "Authorization: Bearer token123" http://localhost:5000/7# Çıktı: Hoşgeldin, admin!Konsol çıktısı:
1[LOG] İstek: /2[LOG] Yanıt: 4013[LOG] İstek: /4[LOG] Yanıt: 200Gördüğün gibi, logging middleware her zaman çalışır, kimlik doğrulama ondan sonra gelen middleware'i kontrol eder. Sıraları değiştirsen, kimlik doğrulama logging'den önce yapılırdı ve sonuç değişirdi. ASP.NET Core'da bu sıra bir kural değil, bir tasarım kararıdır, sen belirlersin.
0 yorum