Middleware'de istek gövdesini okumak ikinci okuyucuyu boş bırakır
Logging middleware'inin istek gövdesini okuması, sonraki handler'ın ve model binding'in boş bir gövde görmesine yol açabilir. Yazar, sorunu 61 baytlık bir örnekle yeniden üretiyor ve EnableBuffering ile Position sıfırlamanın bunu nasıl çözdüğünü gösteriyor. ASP.NET Core ile çalışan herkesin bilmesi gereken bir tuzak.
Kilit noktalar
- Middleware gövdeyi okuduktan sonra handler boş bir akış görebilir; model binding bu durumda null model veya eksik alan hatası üretir.
- Çözüm: context.Request.EnableBuffering() çağrısını okumadan önce yapmak.
- Okumadan sonra context.Request.Body.Position = 0 ile akışı başa almak gerekir; EnableBuffering tek başına bunu yapmaz.
- Varsayılan bellek eşiği yaklaşık 30 KB; daha büyük gövdeler geçici dosyaya yazılır.
- Mümkünse ham gövde yerine boyut veya hash loglayın ve buffering'i yalnızca gerekli rotalarda açın.
Bir API'ye istek gövdesi loglama middleware'i eklendiğinde, POST endpoint'leri geçerli siparişleri validation hatasıyla reddetmeye başlamış. Sebep, istek gövdesinin ileri yönlü bir akış olması: middleware gövdeyi sonuna kadar okuyunca handler'a hiçbir veri kalmıyor. Yazar bunu minimal bir örnekle yeniden üretti; middleware 61 bayt okurken handler 0 bayt görüyor.
Çözüm HttpRequest.EnableBuffering() çağrısı ve okumadan sonra Body.Position değerini 0 yapmak. Bu, akışı aranabilir hale getirir ve iki okuyucunun da aynı baytları görmesini sağlar. Bedeli ise küçük gövdelerin bellekte, büyük olanların geçici dosyaya yazılması; varsayılan eşik yaklaşık 30 KB. Bu yüzden yazar, ham gövdeyi middleware'de okumaktan kaçınmayı, gerekirse buffering'i yalnızca ihtiyaç duyan rotalarda açmayı öneriyor.
Gerçek dünyada kullanımı
- Sipariş API'sinde POST gövdesini denetim için loglarken model binding'in bozulmadığından emin olmak.
- Webhook endpoint'inde imza doğrulaması için ham gövdeyi okuyup aynı isteği handler'da tekrar işlemek.
- Yükleme içeren bir API'de yalnızca belirli rotalarda gövde loglaması açmak.
Neden önemli
Gövdeyi middleware'de okuyan her kod, sonraki tüketiciyi sessizce etkileyebilir. Loglama eklerken bu davranışı bilmek, production'da gerçekçi görünen ama yanlış validation hatalarını önler.