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

kip*_*oep 130 iis wcf

我用.NET 4.0编写了一个WCF服务,它x64使用IIS 7.5 托管在我的Windows 7 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管理器通过打开站点并转到管理下的"配置编辑器"来设置值.不幸的是,我仍然收到请求实体太大的错误,它真的很令人沮丧!

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

Lad*_*nka 200

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

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

您需要设置maxReceivedMessageSize绑定.您还可以设置readerQuotas.

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="10485760">
        <readerQuotas ... />
      </binding>
    </basicHttpBinding>
  </bindings>  
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

  • @ Sandepku-以防万一...我在很长一段时间内遇到了同样的问题,然后意识到我错误地命名了Binding Name,所以WCF使用的是默认值而不是我的配置值,并且给了我确切的信息.同样的错误. (11认同)
  • 我已将maxRecievedMessageSize设置为上述值但仍然得到相同的错误.请求实体太大.. (8认同)
  • 谢谢主席先生,这很有帮助!为maxReceivedMessageSize设置新值需要为maxBufferSize设置相同的值. (2认同)

Rob*_*eco 54

我在使用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>
Run Code Online (Sandbox Code Playgroud)

  • 确保定义绑定名称并使其等于端点上的bindingConfiguration.例如:<binding name ="restLargeBinding"maxBufferPoolSize = ..........>.并在服务配置; <endpoint address =""binding ="webHttpBinding"bindingConfiguration ="restLargeBinding"....... (4认同)
  • 谢谢,这对我使用IIS 7.5与WCF REST服务.实际上,我只需要修改maxReceivedMessageSize属性. (2认同)
  • 效果很好,虽然设置transferMode ="Streamed"给了我一个不好的请求,不得不删除那个 (2认同)

小智 25

我有同样的问题并设置uploadReadAheadSize解决它:

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

"该值必须介于0和214748364之间."

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

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

你必须用记事本打开它.首先备份文件.

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

<location path="Default Web Site" overrideMode="Allow">
    <system.webServer>
        <asp />
    </system.webServer>
</location>"
Run Code Online (Sandbox Code Playgroud)

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

<location path="THENAMEOFTHESITEYOUHAVE" overrideMode="Allow">
    <system.webServer>
        <asp />
        <serverRuntime uploadReadAheadSize="2147483647" />
    </system.webServer>
</location>
Run Code Online (Sandbox Code Playgroud)

</configuration>例如,如果你把它放在最后,你知道你在哪里.

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

  • 有人知道uploadReadAheadSize是否也与自托管WCF服务相关,而不是通过IIS运行?即,这也是一般与Windows Server相关的问题? (2认同)

Luk*_*uke 15

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

.

问题

我意识到,name=""在中属性<service>的标签web.config不是免费的文本字段,因为我认为这是.它是本文档页面中提到的服务合同实现完全限定名称.

如果不匹配,则不会应用绑定设置!

<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>
Run Code Online (Sandbox Code Playgroud)

我希望拯救某人一些痛苦......


Ana*_*nas 7

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

C:\Windows\System32\inetsrv\appcmd  set config "YOUR_WEBSITE_NAME" 
     -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" 
     /commit:apphost
Run Code Online (Sandbox Code Playgroud)


oco*_*erj 7

如果尽管尝试了该线程中的所有解决方案仍遇到此问题,并且要通过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 此处(MSDN)查看有效参数,但是在大多数情况下,您的命令将如下所示:

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提示符netsh,然后发出命令http add sslcert ipport=...以使其正常工作。