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-92F996F4B6222BC0top
总结(万一链路将来死亡),如果您的请求足够大,则客户端和服务之间的证书协商将会随机失败。 为防止这种情况发生,您需要在SSL绑定上启用特定的设置。 从你的IIS服务器,这里是你需要采取的步骤:
- 通过cmd或者powershell,运行
netsh http show sslcert
。 这会给你你当前的configuration。 你会想保存这个,所以你可以稍后再引用它。 - 您应该注意到“协商客户端证书”被禁用。 这是问题设置; 以下步骤将演示如何启用它。
- 不幸的是,没有办法改变现有的绑定。 你必须删除它并重新添加它。 运行
netsh http delete sslcert <ipaddress>:<port>
其中<ipaddress>:<port>
是您之前保存的configuration中显示的IP:端口。 - 现在你可以重新添加绑定。 您可以在这里查看
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