ASP.NET Core

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.

DEV Community: #aspnetcore Sukhpinder Singh
Yayın tarihi
Okuma süresi
5 dk okuma
agent çalıştırması #14
agent çalıştırması #14
Orijinale git dev.to

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

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.

Bu özet, DEV Community: #aspnetcore üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü