我用.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管理器通过打开站点并转到管理下的“配置编辑器”来设置值。不幸的是,我仍然收到请求实体太大的错误,它真的很令人沮丧!
那么有谁知道我还能尝试修复这个错误吗?
这不是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>
我已经能够通过在同一个wcf通道/客户端上具有大内容的请求之前执行虚拟调用(例如,IsAlive返回true)来解决这个问题。显然ssl谈判是在第一次通话时完成的。所以不需要增加Uploadreadaheadsize。
为了解决问题,远程服务器返回了一个意外的响应:(413)使用Resful在WCF上请求实体太大
请参阅我的解释配置
</client>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true"/>
<bindings>
<!-- this for restfull service -->
<webHttpBinding>
<binding name="RestfullwebHttpBinding"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647" transferMode="Streamed">
<readerQuotas
maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647" />
</binding>
</webHttpBinding>
<!-- end -->
<!-- this for Soap v.2 -->
<wsHttpBinding>
<binding name="wsBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
<!--UsernameToken over Transport Security-->
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" establishSecurityContext="true"/>
</security>
</binding>
</wsHttpBinding>
<!-- this for restfull service -->
<!-- this for Soap v.1 -->
<basicHttpBinding>
<binding name="basicBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false" transferMode="Streamed">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
<security mode="None"/>
</binding>
</basicHttpBinding>
</bindings>
<!-- end -->
<services>
<clear/>
<service name="ING.IWCFService.CitisecHashTransfer" >
<endpoint address="http://localhost:8099/CitisecHashTransfer.svc"
behaviorConfiguration="RestfullEndpointBehavior"
binding="webHttpBinding"
bindingConfiguration="RestfullwebHttpBinding"
name="ICitisecHashTransferBasicHttpBinding"
contract="ING.IWCFService.ICitisecHashTransfer" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ING.IWCFService.IWCFServiceValidator, ING.IWCFService"/>
</serviceCredentials>
<serviceSecurityAudit auditLogLocation="Application" serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure"/>
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="100" maxConcurrentInstances="1000"/>
</behavior>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="EndpointBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
<behavior name="RestfullEndpointBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
在我的情况下,我收到此错误消息,因为我更改了服务的命名空间和服务标记指向较旧的命名空间。我刷新了命名空间和错误消失:
<services>
<service name="My.Namespace.ServiceName"> <!-- Updated name -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="MyBindingConfiguratioName"
contract="My.Namespace.Interface" <!-- Updated contract -->
/>
</service>
</services>
使用Visual Studio 2017在IIS Express上出现类似错误。
HTTP错误413.0 - 请求实体太大
由于请求实体太大,因此未显示该页面。
最可能的原因:
- Web服务器拒绝为请求提供服务,因为请求实体太大。
- Web服务器无法为请求提供服务,因为它正在尝试协商客户端证书,但请求实体太大。
- 请求URL或到URL的物理映射(即,URL内容的物理文件系统路径)太长。
你可以尝试的事情:
- 验证请求是否有效。
- 如果使用客户端证书,请尝试: 增加system.webServer/serverRuntime@uploadReadAheadSize 配置SSL端点以在初始SSL握手过程中协商客户端证书。 (netsh http add sslcert ... clientcertnegotiation = enable).vs \ config \ applicationhost.config
通过编辑\.vs\config\applicationhost.config
来解决这个问题。将serverRuntime
从Deny
切换到Allow
,如下所示:
<section name="serverRuntime" overrideModeDefault="Allow" />
如果未编辑此值,则在设置uploadReadAheadSize
时会出现如下错误:
HTTP错误500.19 - 内部服务器错误
无法访问请求的页面,因为页面的相关配置数据无效。
此配置部分不能在此路径中使用。当该部分被锁定在父级别时会发生这种情况。锁定是默认情况下(overrideModeDefault =“Deny”),或由locationMode =“Deny”或遗留allowOverride =“false”的位置标记显式设置。
然后使用以下值编辑Web.config
:
<system.webServer>
<serverRuntime uploadReadAheadSize="10485760" />
...
我在使用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>
我有同样的问题,并设置uploadReadAheadSize
解决了它:
http://www.iis.net/configreference/system.webserver/serverruntime
“该值必须介于0和214748364之间。”
如果你不想做cmd-thing,可以在applicationHost.config文件中轻松设置它。
它位于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错误。
我收到此错误消息,即使我在我的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=""
的<service>
标签中的web.config
属性不是自由文本字段,正如我所想的那样。它是this documentation page中提到的服务合同实现的完全限定名称。
如果不匹配,则不会应用绑定设置!
<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
如果您在尝试此线程中的所有解决方案时遇到此问题,并且您通过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
here (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=...
命令以使其正常工作。
对我来说,在增加对WCF绑定的限制之后,将uploadReadAheadSize
设置为int.MaxValue也解决了问题。
似乎在使用SSL时,预加载了整个请求实体主体,为此使用了此配置数据库属性。
有关详细信息,请参阅:
The page was not displayed because the request entity is too large. iis7
对于其他任何寻找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的更多信息,请访问此网站
在我的情况下,我不得不增加BizTalk中接收位置的“最大接收消息大小”。它的默认值也是64K,所以无论我在web.config中配置了什么,每条消息都被BizTAlk弹回。