我有一个令人费解的问题,我找不到答案。我正在尝试将大量数据上传到 WCF 服务,它会在第一次和后续尝试中返回 413 错误,直到在接受大数据请求后发送低于 64kb 限制的请求。我已经在绑定中扩展了 maxReceivedMessageSize 和 maxStringContentLength 元素,这解决了在初始小请求之后发送请求时的问题(如果这些没有扩展,则返回不同的错误 400 而不是 413)。
我的系统是在 IIS 7 上运行的 ASP.NET 3.5 应用程序,WCF 服务使用自定义绑定、SOAP 消息和客户端/服务器证书。
基本上重现的顺序如下(在2台服务器上测试)
- IIS7 工作进程启动
- 发送大于 64kb 的请求:返回 413 错误
- 发送任何大于 64kb 的请求:返回 413 错误
- 发送小于 64kb 的请求:返回 200 和有效的肥皂响应
- 发送大于 64kb 的请求:返回 200 和有效的肥皂响应
如果 maxReceivedMessageSize 和 maxStringContentLength 元素没有增加,则会发生以下情况:
- IIS7 工作进程启动
- 发送大于 64kb 的请求:返回 413 错误
- 发送任何大于 64kb 的请求:返回 413 错误
- 发送小于 64kb 的请求:返回 200 和有效的肥皂响应
- 发送大于 64kb 的请求:返回 400 错误
调试表明,当收到 413 错误时,服务器并没有真正初始化我的服务,一旦有一个小请求进来,它就会被初始化并注意我的绑定规则,然后允许大量数据。
我怀疑这是 WCF 库中的一个问题,可以通过升级来解决,但这并不是一个真正的选择,需要解决。我在考虑如何在应用程序启动时初始化有问题的服务,或者以某种方式增加默认的 WCF 最大接收字节数
从我的 web.config:
<system.web>
<httpRuntime maxRequestLength="65536" executionTimeout="1800"/>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="67108864" />
</requestFiltering>
</security>
</system.webServer>
<system.serviceModel>
<services>
<service behaviorConfiguration="ServiceTlsBehavior" name="ELSLookupServiceTLS">
<endpoint address="" binding="customBinding" bindingConfiguration="TlsBinding" contract="Lookup" />
</service>
</services>
<bindings>
<customBinding>
<binding name="TlsBinding" closeTimeout="00:04:00" openTimeout="00:12:00" receiveTimeout="00:15:00" sendTimeout="00:05:00">
<textMessageEncoding>
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
</textMessageEncoding>
<httpsTransport requireClientCertificate="true" maxReceivedMessageSize="6553600" maxBufferPoolSize="6553600" maxBufferSize="6553600" />
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceTlsBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="6553600"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我的服务实施:
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class ELSLookupService : Lookup
{
//serivce call implemented here
}