(413) Varlık İsteği Çok Büyük | UploadReadAheadSize


136

x64IIS 7.5 ile Windows 7 Ultimate sistemimde barındırılan .NET 4.0 ile bir WCF hizmeti yazdım . Hizmet yöntemlerinden biri bağımsız değişken olarak bir 'nesne' vardır ve ben bir resim içeren bir bayt [] göndermeye çalışıyorum. Bu resmin dosya boyutu yakl. 48KB, her şey yolunda gidiyor. Ancak daha büyük bir resim yüklemeye çalışıyorsam, WCF hizmeti bir hata döndürüyor: (413) Request Entity Too Large. Tabii ki 3 saat geçirdim Hata mesajını googling ve bu konuyla ilgili gördüğüm her konu 'uploadReadAheadSize' özelliğini yükseltmeyi gösteriyor. Yaptığım şu komutları kullanmak (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ındaki "Yapılandırma Düzenleyicisi" ne giderek değeri ayarlamak için IIS Yöneticisi'ni kullandım. Ne yazık ki hala İstek Varlığı Çok Büyük hatası alıyorum ve gerçekten sinir bozucu oluyor!

Herkes bu hatayı düzeltmek için başka ne deneyebilirim biliyor mu?


6
10485760 = 10MB, 1MB değil
Shaun Rowan

Yanıtlar:


206

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

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

Bağlantınızı ayarlamanız gerekir maxReceivedMessageSize. Ayrıca ayarlamanız gerekebilir readerQuotas.

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="10485760">
        <readerQuotas ... />
      </binding>
    </basicHttpBinding>
  </bindings>  
</system.serviceModel>

8
maxRecievedMessageSize yukarıdaki değere ayarladım ama yine de aynı hatayı alıyorum .. İstek Varlık çok büyük ..
Sandepku

11
@ Sandepku- Her ihtimale karşı ... Bu problemi oldukça uzun bir süre yaşadım ve daha sonra Bağlama Adını yanlış adlandırdığımı fark ettim, bu yüzden WCF yapılandırma değerlerim yerine varsayılan değerleri kullanıyordu ve bana kesin olarak veriyordu. aynı hata.
Adrian Carr

1
maxRecievedMessageSize yukarıdaki değere ayarladım ama yine de aynı hatayı alıyorum .. İstek Varlık çok büyük. Bağlama adı boş değil. Yardım!
NetSide

2
Teşekkür ederim efendim, bu hemen yardımcı oldu! MaxReceivedMessageSize için yeni bir değer ayarlamak, maxBufferSize için aynı değerin ayarlanmasını gerektirir.
DiligentKarma

1
@Sandepku, REST için webhttpbinding kullanıyorsanız, <bağlama> klasöründe ciltleme adını bağlayıcıya eşit yapmanız gerekir <endpoint> 'de
yapılandırma

55

WCF REST Hizmeti ile IIS 7.5 ile aynı sorunu yaşıyordum. POST üzerinden 65k üzerindeki herhangi bir dosyayı yüklemeye çalıştığınızda 413 "İstek Varlığı çok büyük" hatası döndürülür.

Anlamanız gereken ilk şey, web.config dosyasında ne tür bir bağlayıcı yapılandırdığınızdır. İşte harika bir makale ...

WsHttpBinding vs WebHttpBinding vs Temel HttpBinding

Bir REST hizmetiniz varsa "webHttpBinding" olarak yapılandırmanız gerekir. İşte düzeltme:

<system.serviceModel>

<bindings>
   <webHttpBinding>
    <binding 
      maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" transferMode="Streamed">
    </binding>  
   </webHttpBinding>
</bindings>

2
Teşekkürler, bu benim için WCF REST hizmeti ile IIS 7.5 kullanarak çalıştı. Aslında, sadece maxReceivedMessageSize özniteliğini değiştirmek zorunda kaldı.
Alex Yuly

Ben maxReceivedMessageSize vardı, maxBufferSize hile yaptı, maxBufferPoolSize geçersiz bir öznitelik olarak gösterdi.
JabberwockyDecompiler

4
bağlama adını tanımladığınızdan ve uç noktadaki bağlama konfigürasyonuna eşit yaptığınızdan emin olun. Örnek: <bağlama adı = "restLargeBinding" maxBufferPoolSize = ..........>. Ve servis konfigürasyonunda; <endpoint address = "" bağlama = "webHttpBinding" bağlamaConfiguration = "restLargeBinding" .......
smoothumut

2
transferMode = "Streamed" ayarlaması bana kötü bir istek verdi, ancak bunu kaldırmak zorunda kaldı
WtFudgE

1
@smoothumut Eski olduğunu biliyorum, ama bağlayıcıConfiguration = "restLargeBinding" benim için hile yaptı! Bu arada ben kendi kendine barındırılan wcf hizmeti kullanıyorum.
ramires.cabral

26

Ben aynı sorunu vardı ve ayar uploadReadAheadSizeçözüldü:

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

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

Bir cmd-şey yapmak istemiyorsanız, applicationHost.config-fle dosyasında kolayca ayarlanır.

Bulunduğu yer WindowsFOLDER\System32\inetsrv\config(2008 sunucusu).

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

Yapılandırmadaki açıklamalara göre bölümlerin kilidini açmanın önerilen yolu bir konum etiketi kullanmaktır:

<location path="Default Web Site" overrideMode="Allow">
    <system.webServer>
        <asp />
    </system.webServer>
</location>"

Böylece altta yazabilirsiniz (daha önce mevcut olmadığından). Buraya yazıyorum maxvalue- isterseniz kendi değerinizi yazın.

<location path="THENAMEOFTHESITEYOUHAVE" overrideMode="Allow">
    <system.webServer>
        <asp />
        <serverRuntime uploadReadAheadSize="2147483647" />
    </system.webServer>
</location>

</configuration>Örneğin daha önce son koyarsanız , nerede olduğunu biliyorsunuzdur.

Umarım problemlerinizi çözer. Benim için bir SSL yükü sorunuydu, burada çok fazla gönderi uygulamayı dondurdu, (413) İstek Varlığı Çok Büyük hatası verdi.


1
Zaten maxReceivedMessageSizeint.MaxValue olarak ayarlanmış , bu hile yaptı. Bu seçeneği int.MaxValue olarak ayarlamayla ilgili önemli bir endişeniz var mı?
Langdon

2
UploadReadAheadSize'ın IIS üzerinden çalışmayan kendi kendine barındırılan WCF hizmetleriyle de ilgili olup olmadığını bilen var mı? yani bu aynı zamanda genel olarak Windows Server ile ilgili bir sorun mu?
Mayıs 14'te antscode

@antscode Kendinden barındırılan bir API'm var ve aynı sorunu yaşıyorum - kendi kendinize barındırılan hizmetinizle çözdünüz mü?
Trevor Daniel

18

Her ne kadar maxayarlarımı WCF hizmet yapılandırma dosya bağlama içinde ayarlamış olsa bile, bu hata iletisini alıyordu :

<basicHttpBinding>
        <binding name="NewBinding1"
                 receiveTimeout="01:00:00"
                 sendTimeout="01:00:00"
                 maxBufferSize="2000000000"
                 maxReceivedMessageSize="2000000000">

                 <readerQuotas maxDepth="2000000000"
                      maxStringContentLength="2000000000"
                      maxArrayLength="2000000000" 
                      maxBytesPerRead="2000000000" 
                      maxNameTableCharCount="2000000000" />
        </binding>
</basicHttpBinding>

Bu bağlama ayarları uygulanmamış gibi görünüyordu, bu nedenle aşağıdaki hata mesajı:

IIS7 - (413) Hizmete bağlanırken Varlık İsteği Çok Büyük.

.

Sorun

Ben fark name=""dahilinde özellik <service>etiketinin web.configolduğu değil ben öyle düşündüm gibi bir serbest metin alanı. Öyle Bir hizmet sözleşmesinin bir uygulama tam adı olarak dahilinde belirtilen bu dokümanları sayfasına .

Bu eşleşmezse ciltleme ayarları uygulanmaz!

<services>
  <!-- The namespace appears in the 'name' attribute -->
  <service name="Your.Namespace.ConcreteClassName">
    <endpoint address="http://localhost/YourService.svc"
      binding="basicHttpBinding" bindingConfiguration="NewBinding1"
      contract="Your.Namespace.IConcreteClassName" />
  </service>
</services>

Umarım birisi acı çeker ...


1
Bu çözümü eklediğiniz için teşekkürler! Dolaylı olarak, sözleşme adımın geliştirmede değişmesi, ancak değişikliğin üretime doğru şekilde dağıtılmaması nedeniyle sorunumu çözdüm. Bu ayarın kontrol edilmesi, varsayılan mesaj boyutu ayarları kullanıldığından (413) Varlık İsteği Çok büyük hatalarımı çözdü.
Doug Knudsen

Bunun birisine yardım etmesinden gerçekten memnunum. Bunun için iyi bir zaman geçirdim, bu yüzden birinin gününü daha az acı verici hale getireceğini umdum.
Luke

9

Bu konudaki tüm çözümleri denemenize rağmen bu sorunla karşılaşıyorsanız ve hizmete SSL (ör. Https) ile bağlanıyorsanız, bu yardımcı olabilir:

http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top

Özetlemek gerekirse (bağlantının gelecekte ölmesi durumunda), talepleriniz yeterince büyükse, istemci ile hizmet arasındaki sertifika görüşmesi rastgele başarısız olur. Bunun olmasını önlemek için, SSL bağlantılarınızda belirli bir ayarı etkinleştirmeniz gerekir. IIS sunucunuzdan atmanız gereken adımlar şunlardır:

  1. Cmd veya powershell ile çalıştırın netsh http show sslcert. Bu size mevcut yapılandırmanızı verecektir. Bunu bir şekilde kaydetmek isteyeceksiniz, böylece daha sonra tekrar başvurabilirsiniz.
  2. "Müşteri Sertifikasını Müzakere Et" seçeneğinin devre dışı olduğunu fark etmelisiniz. Sorun ayarı budur; Aşağıdaki adımlar, nasıl etkinleştirileceğini gösterecektir.
  3. Ne yazık ki mevcut bağları değiştirmenin bir yolu yoktur; silmeniz ve yeniden eklemeniz gerekir. Daha önce kaydettiğiniz yapılandırmada gösterilen IP: bağlantı noktasının netsh http delete sslcert <ipaddress>:<port>nerede <ipaddress>:<port>olduğunu çalıştırın .
  4. Artık bağlamayı yeniden ekleyebilirsiniz. netsh http add sslcert Burada (MSDN) için geçerli parametreleri görüntüleyebilirsiniz, ancak çoğu durumda komutunuz şöyle görünecektir:

netsh http add sslcert ipport=<ipaddress>:<port> appid=<application ID from saved config including the {}> certhash=<certificate hash from saved config> certstorename=<certificate store name from saved config> clientcertnegotiation=enable

Birden fazla SSL bağlantınız varsa, işlemi her biri için tekrar edersiniz. Umarım bu, başımıza saatlerce ve saatlerce süren baş ağrısının bu sorunun neden olmasına neden olur

EDIT: Deneyimlerime göre, aslında netsh http add sslcertdoğrudan komut satırından komutu çalıştıramazsınız . Önce netsh komut istemini yazmanız netshve ardından komutun http add sslcert ipport=...çalışması için komutunuzu vermeniz gerekir.


Gönderi için teşekkürler, sorunun bizim için izole edilmesine yardımcı oldu, SSL'yi kapatmak WCF hatasını kaldırıyor. Ne yazık ki, müşteri görüşmesi SSL üzerinde çalışmak için sonucumuzu değiştirmedi. Stil geçiş yapmak için diğer bitleri arıyor :-(
Jafin

8

Bu, sorunu çözmeme yardımcı oldu (bir satır - okunabilirlik / kopyalama yeteneği için bölünmüş):

C:\Windows\System32\inetsrv\appcmd  set config "YOUR_WEBSITE_NAME" 
     -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" 
     /commit:apphost

WCF'nizi SharePoint ortamında mı barındırıyorsunuz? ve değişiklikleri uyguladıktan sonra IIS'nizi yeniden başlatmanız gerekti mi?
theITvideos

2

Benim uploadReadAheadSizeiçin int.MaxValue olarak ayarlamak , WCF bağlanması sınırlarını da artırdıktan sonra da sorunu çözdü.

SSL kullanırken, bu metatabanı özelliğinin kullanıldığı tüm istek varlığı gövdesi önceden yüklenmiştir.

Daha fazla bilgi için, bkz.

İstek varlığı çok büyük olduğundan sayfa görüntülenmedi. iis7


1
SSL ve 'uploadReadAheadSize' ile ilgili bulgularınız çok iyi! .. Ama yine de maksimum değere ayarlamanızı tavsiye etmiyorum
Öğrenci

1

IIS WCF hatası 413'ü arayan başka herkes için: Varlığın büyük olmasını isteyin ve Sharepoint'te bir WCF hizmeti kullanın, bu sizin için bilgidir. Birden çok site / yayında önerilen uygulama ana bilgisayarında ve web.config dosyasında yer alan ayarlar, MultipleBaseAddressBasicHttpBindingServiceHostFactory kullanılıyorsa SharePoint'te çalışmaz. SPWebService.Content hizmetini almak, yeni bir SPWcvSettings nesnesi oluşturmak ve ayarları hizmetiniz için yukarıdaki gibi güncelleştirmek için SP Powershell'i kullanabilirsiniz (bunlar olmayacak). Ayarları oluştururken ve eklerken yalnızca hizmetin adını (örneğin [hizmetiniz.svc]) kullanmayı unutmayın. Daha fazla bilgi için bu siteye bakın https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service


1

Benim durumumda, BizTalk'ta Alma Konumunun "Alınan maksimum mesaj boyutunu" arttırmak zorunda kaldım. Bunun ayrıca varsayılan değeri 64K'dır ve bu nedenle web.config dosyasında ne yapılandırdığımdan bağımsız olarak her ileti BizTAlk tarafından geri döndürüldü.


1

Ben aynı wcf kanalında / istemcide büyük içerik ile istek hemen önce kukla bir çağrı (örneğin IsAlive dönen true) yürüterek bunu çözmek mümkün. Görünüşe göre SSL görüşmesi ilk çağrı yapılır. Yani Uploadreadaheadsize artırmak gerek yok.


0

sorun için uzak sunucu beklenmedik bir yanıt verdi: (413) WCF'de Varlık Çok Büyük Talep Edildi

lütfen açıklama yapılandırmamı inceleyin

</client>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true"/>

<bindings>

   <!-- this for restfull service -->
  <webHttpBinding>
    <binding name="RestfullwebHttpBinding"
      maxBufferPoolSize="2147483647"
      maxReceivedMessageSize="2147483647"
      maxBufferSize="2147483647" transferMode="Streamed">

      <readerQuotas 
        maxDepth="2147483647" 
        maxStringContentLength="2147483647"
        maxArrayLength="2147483647" 
        maxBytesPerRead="2147483647" /> 

    </binding>
  </webHttpBinding>
  <!-- end -->

   <!-- this for Soap v.2 -->
  <wsHttpBinding>
    <binding name="wsBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
      <!--UsernameToken over Transport Security-->
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="true"/>
      </security>
    </binding>
  </wsHttpBinding>
   <!-- this for restfull service -->

   <!-- this for Soap v.1 -->
  <basicHttpBinding>
    <binding name="basicBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false" transferMode="Streamed">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <security mode="None"/>
    </binding>
  </basicHttpBinding>
</bindings> 
<!-- end -->

<services>
  <clear/>

  <service name="ING.IWCFService.CitisecHashTransfer"  >
    <endpoint address="http://localhost:8099/CitisecHashTransfer.svc"
                  behaviorConfiguration="RestfullEndpointBehavior"
                  binding="webHttpBinding"
                  bindingConfiguration="RestfullwebHttpBinding"
                  name="ICitisecHashTransferBasicHttpBinding"
                  contract="ING.IWCFService.ICitisecHashTransfer" />
  </service>

</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>

      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ING.IWCFService.IWCFServiceValidator, ING.IWCFService"/>
      </serviceCredentials>
      <serviceSecurityAudit auditLogLocation="Application" serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure"/>
      <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="100" maxConcurrentInstances="1000"/>

    </behavior>
    <behavior>
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="EndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior> 
    <behavior name="RestfullEndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"  />
      <webHttp/>
    </behavior> 
  </endpointBehaviors>
</behaviors>


0

Benim durumumda, hizmetin ad alanını değiştirdiğimden ve services etiketi eski ad alanına işaret edildiğinden bu hata iletisini alıyordum. Ad alanını yeniledim ve hata kayboluyor:

<services>
  <service name="My.Namespace.ServiceName"> <!-- Updated name -->
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="MyBindingConfiguratioName" 
              contract="My.Namespace.Interface" <!-- Updated contract -->
    />
  </service>
</services>

0

Visual Studio 2017 ile IIS Express'te benzer bir hata var.

HTTP Hatası 413.0 - Varlık İsteği Çok Büyük

İstek varlığı çok büyük olduğundan sayfa görüntülenmedi.

En olası nedenler:

  • Web sunucusu, istek varlığı çok büyük olduğu için isteğe hizmet vermeyi reddediyor.

  • Web sunucusu, bir istemci sertifikası üzerinde anlaşmaya çalıştığı, ancak istek varlığı çok büyük olduğu için isteğe hizmet veremiyor.

  • İstek URL'si veya URL ile fiziksel eşleme (yani, URL içeriğinin fiziksel dosya sistemi yolu) çok uzun.

Deneyebileceğiniz şeyler:

  • İsteğin geçerli olduğunu doğrulayın.

  • İstemci sertifikaları kullanıyorsanız şunları deneyin:

    • Artan system.webServer/serverRuntime@uploadReadAheadSize

    • SSL uç noktanızı, ilk SSL anlaşmasının bir parçası olarak istemci sertifikaları üzerinde anlaşmak üzere yapılandırın. (netsh http add sslcert ... clientcertnegotiation = enable) .vs \ config \ applicationhost.config

Bunu düzenleyerek çözün \.vs\config\applicationhost.config. Anahtar serverRuntimegelen Denyiçin Allowböyle:

<section name="serverRuntime" overrideModeDefault="Allow" />

Bu değer düzenlenmezse, ayarlarken uploadReadAheadSizeşöyle bir hata mesajı alırsınız :

HTTP Hatası 500.19 - Dahili Sunucu Hatası

Sayfa için ilgili yapılandırma verileri geçersiz olduğundan istenen sayfaya erişilemiyor.

Bu yapılandırma bölümü bu yolda kullanılamaz. Bu, bölüm üst düzeyde kilitlendiğinde olur. Kilitleme varsayılan olarak (overrideModeDefault = "Deny") veya açıkça overrideMode = "Deny" veya eski allowOverride = "false" olan bir konum etiketi ile ayarlanır.

Ardından Web.configaşağıdaki değerlerle düzenleyin :

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...

Eğer oy verirseniz, lütfen nedenini söyleyin. Aksi takdirde cevapları iyileştirmek çok zor.
Ogglas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.