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

我已经用.NET 4.0编写了一个WCF服务,该服务托pipe在我的Windows 7 x64旗舰版系统(带有IIS 7.5)上。 其中一个服务方法有一个“对象”作为参数,我试图发送一个包含图片的字节[]。 只要这张照片的文件大小小于大约 48KB,一切顺利。 但是,如果我试图上传更大的图片,WCF服务返回错误: (413) Request Entity Too Large. 所以现在我花了3个小时search错误消息,我看到关于这个问题的每个主题都build议提高'uploadReadAheadSize'属性。 所以我所做的是使用下面的命令(10485760 = 10MB):

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

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

我也使用IISpipe理器通过打开网站,并转到pipe理下的“configuration编辑器”来设置值。 不幸的是,我仍然得到了请求实体太大的错误,它变得非常沮丧!

那么有谁知道还有什么我可以尝试解决这个错误?

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

要解决此问题,您必须重新configuration您的服务以接受较大的消息。 此问题以前发射了400错误的请求错误,但在较新的版本WCF开始使用413这是错误的这种types正确的状态代码。

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

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

我与IIS 7.5具有相同的问题与WCF REST服务。 试图通过POST上传65k以上的任何文件,它会返回错误413“请求实体太大”。

你需要了解的第一件事是你在web.config中configuration了什么样的绑定。 这是一篇很棒的文章

BasicHttpBinding与WsHttpBinding与WebHttpBinding

如果你有一个REST服务,那么你需要configuration它为“webHttpBinding”。 这是修复:

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

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

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

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

如果你不想做一个cmd的东西,可以很容易地将它设置在applicationHost.config-fle中。

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

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

根据configuration中的注释,解锁部分的build议方法是使用位置标记:

 <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开销问题,太多的post冻结了应用程序,引发了(413)Request Entity Too Large错误。

我收到了这个错误信息,即使我在我的WCF服务configuration文件的绑定中设置了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)连接到服务时请求实体太大。

问题

我意识到web.config<service>标记中的name=""属性不是一个自由文本字段,正如我以为的那样。 它是本文档页面中提到的服务合同实施完全限定名称

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

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

我希望能救一些人的痛苦

这帮助我解决了这个问题(一行 – 为了可读性/可复制性而分裂):

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

如果您尝试了此线程中的所有解决scheme,并且正在通过SSL(例如https)连接到服务,则可能会遇到此问题:

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

总结(万一链路将来死亡),如果您的请求足够大,则客户端和服务之间的证书协商将会随机失败。 为防止这种情况发生,您需要在SSL绑定上启用特定的设置。 从你的IIS服务器,这里是你需要采取的步骤:

  1. 通过cmd或者powershell,运行netsh http show sslcert 。 这会给你你当前的configuration。 你会想保存这个,所以你可以稍后再引用它。
  2. 您应该注意到“协商客户端证书”被禁用。 这是问题设置; 以下步骤将演示如何启用它。
  3. 不幸的是,没有办法改变现有的绑定。 你必须删除它并重新添加它。 运行netsh http delete sslcert <ipaddress>:<port>其中<ipaddress>:<port>是您之前保存的configuration中显示的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命令。 你需要首先inputnetsh来inputnetsh提示符,然后像http add sslcert ipport=...一样发出你的命令,以使其工作。

在我的情况下,我不得不增加BizTalk中接收位置的“最大收到邮件大小”。 这也有一个默认值64K,所以每个消息被BizTAlk反弹,无论我在我的web.configconfiguration

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

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

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

看来,在使用SSL时,整个请求实体主体被预加载,为此使用这个元数据库属性。

有关更多信息,请参阅:

该页面未显示,因为请求实体太大。 IIS7