(413) İstek Varlığı Çok Büyük | uploadReadAheadSize

Windows 7 x64 Ultimate sistemimde IIS 7.5 ile barındırılan .NET 4.0 ile bir WCF servisi yazdım. Servis yöntemlerinden birinde argüman olarak bir 'nesne' var ve ben bir resim içeren bir byte[] göndermeye çalışıyorum. Bu resmin dosya boyutu yaklaşık 48KB'den az olduğu sürece her şey yolunda gidiyor. Ancak daha büyük bir resim yüklemeye çalışırsam, WCF hizmeti bir hata döndürüyor: (413) Request Entity Too Large. Tabii ki hata mesajını Google'da araştırmak için 3 saat harcadım ve bu konuda gördüğüm her konu 'uploadReadAheadSize' özelliğinin yükseltilmesini öneriyor. Bu yüzden aşağıdaki komutları kullandım (10485760 = 10MB):

"appcmd.exe set config -section:system.webserver/serverruntime/uploadreadaheadsize: 10485760 /commit:apphost"

"cscript adsutil.vbs set w3svc/<APP_ID>/uploadreadaheadsize 10485760"

Ayrıca siteyi açıp Yönetim altında "Yapılandırma Düzenleyicisi"ne giderek değeri ayarlamak için IIS Yöneticisini kullandım. Ne yazık ki hala Request Entity Too Large hatası alıyorum ve bu gerçekten sinir bozucu olmaya başladı!

Bu hatayı düzeltmek için başka ne deneyebileceğimi bilen var mı?

Çözüm

Bu IIS'nin sorunu değil, WCF'nin sorunudur. WCF, büyük mesajlarla hizmet reddi saldırısını önlemek için varsayılan olarak mesajları 65KB ile sınırlar. Ayrıca MTOM kullanmazsanız, byte[]'ı base64 kodlu dizeye gönderir (boyutta %33 artış) => 48KB * 1,33 = 64KB

Bu sorunu çözmek için hizmetinizi daha büyük mesajları kabul edecek şekilde yeniden yapılandırmanız gerekir. Bu sorun daha önce 400 Bad Request hatasını tetikliyordu, ancak yeni sürümde WCF bu tür hatalar için doğru durum kodu olan 413'ü kullanmaya başladı.

Bağlayıcınızda maxReceivedMessageSize ayarını yapmanız gerekir. Ayrıca readerQuotas ayarlamanız da gerekebilir.









Yorumlar (10)

Bir WCF REST Hizmeti ile IIS 7.5 ile aynı sorunu yaşıyordum. POST ile 65k üzerindeki herhangi bir dosyayı yüklemeye çalıştığımda Hata 413 "Request Entity too large" döndürüyordu.

Anlamanız gereken ilk şey, web.config dosyasında ne tür bir bağlama yapılandırdığınızdır. Burada harika bir makale var...

https://stackoverflow.com/questions/2650785/basichttpbinding-vs-wshttpbinding-vs-webhttpbinding

Bir REST servisiniz varsa, bunu "webHttpBinding" olarak yapılandırmanız gerekir. İşte çözüm:








Yorumlar (5)

Ben de aynı sorunu yaşadım ve uploadReadAheadSize ayarını yapmak sorunu çözdü:

http://www.iis.net/configreference/system.webserver/serverruntime

"Değer 0 ile 2147483647 arasında olmalıdır."

Eğer cmd ile bir şey yapmak istemiyorsanız, bunu applicationHost.config-fle içinde kolayca ayarlayabilirsiniz.

WindowsFOLDER\System32\inetsrv\config` (2008 sunucusu) içinde bulunur.

Not defteri ile açmalısınız. Önce dosyanın bir yedeğini alın.

Yapılandırmadaki yorumlara göre, bölümlerin kilidini açmak için önerilen yol bir konum etiketi kullanmaktır:





"

Böylece alt kısma yazabilirsiniz (daha önce mevcut olmadığı için). Ben buraya maxvalue yazıyorum - isterseniz kendi değerinizi yazın.






Örneğin `` dan önce en sona koyarsanız, nerede olduğunu bilirsiniz.

Umarım bu sorunlarınızı çözer. Bu benim için bir SSL ek yük sorunuydu, çok fazla gönderi uygulamayı dondurdu ve (413) Request Entity Too Large hatası verdi.

Yorumlar (3)