我用.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)
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)
小智 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错误.
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)
我希望拯救某人一些痛苦......
这有助于我解决问题(一行 - 为了可读性/可复制性而拆分):
C:\Windows\System32\inetsrv\appcmd set config "YOUR_WEBSITE_NAME"
-section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647"
/commit:apphost
Run Code Online (Sandbox Code Playgroud)
如果尽管尝试了该线程中的所有解决方案仍遇到此问题,并且要通过SSL(例如https)连接到服务,则可能会有所帮助:
http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top
总结一下(以防将来链接消失),如果您的请求足够大,则客户端和服务之间的证书协商将随机失败。为了避免这种情况的发生,您需要在SSL绑定中启用特定设置。在IIS服务器上,您需要执行以下步骤:
netsh http show sslcert。这将为您提供当前的配置。您将希望以某种方式保存此内容,以便稍后再次引用。netsh http delete sslcert <ipaddress>:<port>这里<ipaddress>:<port>是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直接从命令行运行命令。您首先需要通过键入来输入netsh提示符netsh,然后发出命令http add sslcert ipport=...以使其正常工作。
| 归档时间: |
|
| 查看次数: |
222870 次 |
| 最近记录: |