HTTP Middleware Yazarken Sık Yapılan 3 Hata
Middleware, istek ve yanıtı işleyen kritik bir katmandır. Ama yazarken yapılan hatalar uygulamayı kırabilir. Şimdi sık yapılan 3 hatayı ve çözümünü görelim.
Middleware'in işi isteği bir sonraki middleware'e geçmektir. Next() çağrısını unutursanız, istek orada kalır ve asla yanıt dönemez.
YANLIŞ:
1app.Use(async (context, next) => {2context.Response.Headers.Add("X-Custom", "test");3// next() çağrısı yok, istek burada takılı kalır4});DOĞRU:
1app.Use(async (context, next) => {2context.Response.Headers.Add("X-Custom", "test");3await next(); // İsteği bir sonraki middleware'e geç4});Çıktı: Doğru versiyonda istek devam eder, yanıt alınır. Yanlış versiyonda tarayıcı sürekli bekler.
Response başı (header) gönderildikten sonra değiştiremezsiniz. Middleware'de yanıt gövdesi yazılmadan önce header'ları ayarlamalısınız.
YANLIŞ:
1app.Use(async (context, next) => {2await next();3context.Response.Headers.Add("X-Processed", "true"); // Çok geç!4});DOĞRU:
1app.Use(async (context, next) => {2context.Response.Headers.Add("X-Processed", "true"); // Önce header3await next(); // Sonra next()4});Çıktı: Doğru versiyonda header eklenir. Yanlış versiyonda "InvalidOperationException: Headers already sent" hatası alırsınız.
Middleware'de hata oluşursa ve yakalamazsanız, tüm istek işlemi başarısız olur. Try-catch ile koruma gerekir.
YANLIŞ:
1app.Use(async (context, next) => {2var value = int.Parse(context.Request.Query["id"]); // Hata riski!3await next();4});DOĞRU:
1app.Use(async (context, next) => {2try {3var value = int.Parse(context.Request.Query["id"]);4await next();5}6catch (FormatException) {7context.Response.StatusCode = 400;8await context.Response.WriteAsync("Invalid ID format");9}10});Çıktı: Doğru versiyonda 400 hatası döner. Yanlış versiyonda 500 hatası ve uygulama çökebilir.
Middleware yazarken şunu unutmayın:
- Next() çağrısını yapmayı unutmayın, istek takılıp kalır.
- Header'ları cevap gönderilmeden ayarlayın, sonra değiştiremezsiniz.
- Try-catch ile hataları yakalayın, uygulamanın çökmesini önleyin.
Bu üç hata çoğu middleware sorununa neden olur. İlk kez yazıyorsanız bu kontrolleri yapın.
4 yorum
uygulamaya bağlı express mesela next çağırmazsan middleware orada kapanıyor ama yanıt göndermediysen tarayıcı bekler
mı timeout kadar bekliyo ben denedim olmadı ya hemen error fırlatıyo tarayıcı next çağırmazsan middleware sonlanıyor mu direkt yoksa beklemesi gerekiyo mu
aynen başında next unutunca middleware chain kesiliyo sonra istek hiçbir yere gitmediği için tarayıcı sürekli bekliyo timeout kadar da bekler header
next unuttuk diye tarayıcı donup kalıyo bu klasik bi sorun header yazıldıktan sonra