ASP.NET Core'da middleware pipeline'ı, gelen her HTTP isteğinin sırayla geçtiği bir zincir olarak düşünülebilir. Bu zincirin sırasını ve çalışma mantığını anlamadan yazılan kod, beklenmedik hatalara yol açabiliyor.
Sıralama Neden Kritik?
Kimlik doğrulama middleware'ini yetkilendirme middleware'inden sonra eklemek gibi bir hata, "her istek yetkisiz" gibi anlaşılması zor hatalara yol açabiliyor. UseAuthentication() her zaman UseAuthorization()'dan önce gelmeli, çünkü yetkilendirme, kimliği doğrulanmış bir kullanıcıya ihtiyaç duyuyor.
Kendi Middleware'ini Yazmak
İstek/yanıt süresini loglamak gibi çapraz kesen (cross-cutting) bir ihtiyaç için özel bir middleware yazmak, bu mantığı her controller'a dağıtmaktan çok daha temiz:
public class RequestTimingMiddleware
{
private readonly RequestDelegate _next;
public RequestTimingMiddleware(RequestDelegate next) => _next = next;
public async Task InvokeAsync(HttpContext context)
{
var sw = Stopwatch.StartNew();
await _next(context);
sw.Stop();
Console.WriteLine($"{context.Request.Path} - {sw.ElapsedMilliseconds}ms");
}
}
Short-Circuit: Zinciri Erken Kesmek
Bazı middleware'ler (örneğin bir health check endpoint'i) isteği zincirin geri kalanına iletmeden doğrudan yanıt döndürüyor. _next(context) çağrısını hiç yapmamak, isteğin oradan sonraki middleware'lere ulaşmasını engelliyor — bu bilinçli bir tasarım kararı olmalı, kazara yapılan bir hata değil.
Exception Handling Middleware'i En Başa Koymak
Hata yakalama middleware'ini pipeline'ın en başına koymak, zincirin geri kalanında oluşan herhangi bir exception'ı yakalayabilmesini sağlıyor. Bunu sona koymak, birçok hatanın yakalanmadan kullanıcıya çirkin bir stack trace olarak gitmesine sebep olabiliyor.
Sonuç
Middleware pipeline'ı, ASP.NET Core'un en güçlü ama en az anlaşılan parçalarından biri. Sıralamanın mantığını kavradıktan sonra, çapraz kesen ihtiyaçları (loglama, hata yönetimi, kimlik doğrulama) merkezi ve temiz bir şekilde yönetmek çok daha kolaylaşıyor.