(413)请求实体太大|应将UploadReadAheadSize

时间:2012-04-12 11:49:10

标签: wcf iis

我用.NET 4.0编写了一个WCF服务,它使用IIS 7.5托管在我的Windows 7 x64 Ultimate系统上。 其中一个服务方法有一个'对象'作为参数,我正在尝试发送一个包含图片的byte []。 只要这张图片的文件大小小于约。 48KB,一切顺利。但是,如果我尝试上传更大的图片,WCF服务会返回错误:(413) Request Entity Too Large. 所以当然我花了3个小时谷歌搜索错误消息,我看到的关于这个主题的每个主题建议提高'uploadReadAheadSize'属性。 所以我所做的就是使用以下命令(10485760 = 10MB):

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

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

我还使用IIS管理器通过打开站点并转到管理下的“配置编辑器”来设置值。 不幸的是,我仍然收到Request Entity Too Large错误,而且它真的很令人沮丧!

那么有人知道我还能尝试修复这个错误吗?

14 个答案:

答案 0 :(得分:194)

这不是IIS的问题,而是WCF的问题。默认情况下,WCF将消息限制为65KB,以避免使用大消息进行拒绝服务攻击。此外,如果您不使用MTOM,它会将byte []发送到base64编码的字符串(大小增加33%)=&gt; 48KB * 1,33 = 64KB

要解决此问题,您必须重新配置服务以接受更大的邮件。此问题之前解决了400 Bad Request错误,但在较新版本中,WCF开始使用413,这是此类错误的正确状态代码。

您需要在绑定中设置maxReceivedMessageSize。您还可以设置readerQuotas

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

答案 1 :(得分:51)

我在使用WCF REST服务的IIS 7.5中遇到了同样的问题。尝试通过POST上传65k以上的任何文件,它将返回错误413“请求实体太大”。

您需要了解的第一件事是您在web.config中配置了哪种绑定。这是一篇很棒的文章......

BasicHttpBinding vs WsHttpBinding vs WebHttpBinding

如果您有REST服务,则需要将其配置为“webHttpBinding”。这是修复:

<system.serviceModel>

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

答案 2 :(得分:24)

我遇到了同样的问题并设置uploadReadAheadSize解决了它:

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

“该值必须介于0和2147483647之间。”

如果你不想做一个cmd-thing,可以在applicationHost.config-fle中轻松设置它。

它位于WindowsFOLDER\System32\inetsrv\config(2008服务器)。

您必须使用记事本打开它。首先备份文件。

根据配置中的注释,解锁部分的推荐方法是使用位置标记:

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

所以你可以写在底部(因为之前不存在)。我在这里写maxvalue - 如果你愿意,写下自己的价值。

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

例如,如果你在</configuration>之前将它放在最后,你知道你拥有它的位置。

希望能解决你的问题。对我来说这是一个SSL开销问题,过多的帖子冻结了应用程序,引发了(413)Request Entity Too Large 错误。

答案 3 :(得分:14)

我收到此错误消息,即使我在WCF服务配置文件的绑定中设置了max设置:

<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>

似乎没有应用这些绑定设置,因此出现以下错误消息:

  

IIS7 - (413)连接服务时请求实体太大。

问题

我意识到name=""的{​​{1}}标记中的<service>属性不是一个自由文本字段,正如我所想的那样。它是this documentation page中提到的服务合同实施的完全限定名称

如果不匹配,那么绑定设置将无法应用!

web.config

我希望能为某人省下一些痛苦......

答案 4 :(得分:7)

这有助于我解决问题(一行 - 为了可读性/可复制性而拆分):

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

答案 5 :(得分:4)

如果您在尝试此线程中的所有解决方案时遇到此问题,并且您通过SSL(例如https)连接到服务,这可能会有所帮助:

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

总结(如果链接将来死亡),如果您的请求足够大,客户端和服务之间的证书协商将随机失败。要防止这种情况发生,您需要在SSL绑定上启用某个设置。从IIS服务器,您需要执行以下步骤:

  1. 通过cmd或powershell,运行netsh http show sslcert。这将为您提供当前配置。你想以某种方式保存它,以便以后再次引用它。
  2. 您应该注意到“协商客户端证书”已被禁用。这是问题设定;以下步骤将演示如何启用它。
  3. 不幸的是,没有办法改变现有的绑定;你必须删除它并重新添加它。运行netsh http delete sslcert <ipaddress>:<port>,其中<ipaddress>:<port>是您之前保存的配置中显示的IP:端口。
  4. 现在您可以重新添加绑定。您可以查看netsh http add sslcert here (MSDN)的有效参数,但在大多数情况下,您的命令将如下所示:
  5. 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

    如果您有多个SSL绑定,则会为每个绑定重复此过程。希望这有助于为其他人节省这个问题引起我头痛的时间和小时。

    编辑:根据我的经验,您无法直接从命令行运行netsh http add sslcert命令。您需要先键入netsh,然后发出http add sslcert ipport=...之类的命令才能输入netsh提示符,以使其正常工作。

答案 6 :(得分:1)

对于其他任何寻找IIS WCF错误的人413:请求实体到大型并在Sharepoint中使用WCF服务,这是您的信息。如果使用MultipleBaseAddressBasicHttpBindingServiceHostFactory,则在SharePoint中的其他站点/帖子中建议的应用程序主机和web.config中的设置不起作用。您可以使用SP Powershell获取SPWebService.Content服务,创建新的SPWcvSettings对象并更新上述服务的设置(它们将不存在)。请记住在创建和添加设置时只使用服务名称(例如[yourservice.svc])。有关详情https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service

,请访问此网站

答案 7 :(得分:1)

在我的情况下,我不得不增加BizTalk中接收位置的“最大接收消息大小”。它的默认值也是64K,所以无论我在web.config中配置了什么,BizTAlk都会弹回每条消息。

答案 8 :(得分:1)

对我来说,将uploadReadAheadSize设置为int.MaxValue也解决了问题,同时增加了对WCF绑定的限制。

似乎在使用SSL时,会预加载整个请求实体主体,并使用此配置数据库属性。

有关详细信息,请参阅:

The page was not displayed because the request entity is too large. iis7

答案 9 :(得分:0)

我已经能够通过在同一个wcf频道/客户端上具有大内容的请求之前执行虚拟调用(例如,IsAlive返回true)来解决这个问题。显然ssl谈判是在第一次通话时完成的。所以不需要增加Uploadreadaheadsize。

答案 10 :(得分:0)

对于问题,远程服务器返回了意外的响应:(413)具有Resful的WCF上的请求实体太大

请参阅我的解释配置

    

aes_string

答案 11 :(得分:0)

在我的情况下,我收到此错误消息,因为更改了服务的名称空间,并且服务标签指向了较旧的名称空间。我刷新了命名空间,错误消失了:

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

答案 12 :(得分:0)

在带有Visual Studio 2017的IIS Express上收到类似的错误。

  

HTTP错误413.0-请求实体太大

     

由于请求实体太大,因此未显示该页面。

     

最可能的原因:

     
      
  • Web服务器拒绝处理请求,因为该请求   实体太大。

  •   
  • Web服务器无法处理请求,因为它试图   协商客户证书,但请求实体太大。

  •   
  • 请求URL或对该URL的物理映射(即物理   URL内容的文件系统路径)太长。

  •   
     

您可以尝试的事情:

     
      
  • 验证请求是否有效。

  •   
  • 如果使用客户端证书,请尝试:

         
        
    • 增加system.webServer/serverRuntime@uploadReadAheadSize

    •   
    • 配置SSL端点以协商客户端证书作为一部分   初始SSL握手的时间。 (netsh http添加sslcert ...   clientcertnegotiation = enable).vs \ config \ applicationhost.config

    •   
  •   

通过编辑\.vs\config\applicationhost.config解决此问题。将serverRuntimeDeny切换到Allow,如下所示:

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

如果未编辑此值,则在设置uploadReadAheadSize时会收到如下错误:

  

HTTP错误500.19-内部服务器错误

     

无法访问请求的页面,因为相关   该页面的配置数据无效。

     

此配置部分不能在此路径上使用。有时候是这样的   当节锁定在父级时。锁定是通过   默认值(overrideModeDefault =“ Deny”),或由位置明确设置   标记并带有overlayMode =“ Deny”或旧版allowOverride =“ false”。

然后使用以下值编辑Web.config

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

答案 13 :(得分:0)

我添加这个后问题就解决了:

  <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits
                    maxAllowedContentLength="104857600"
                />
            </requestFiltering>
        </security>
  </system.webServer>