1

我有一个令人费解的问题,我找不到答案。我正在尝试将大量数据上传到 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
}
4

1 回答 1

2

好的,找到了问题,如果有人在这里遇到这个问题,为了参考起见:错误与初始 SSL 流量和 IIS 相关,并且似乎与 WCF 无关(我可能错了)。

必须增加 IIS 中的 uploadReadAheadSize 设置。

在 IIS7 中,您可以在 serverRuntime 元素下的 web.config 中扩展它,请参阅: http ://www.iis.net/configreference/system.webserver/serverruntime

在 IIS6 中,它也可能会弹出,它显然是每个站点设置的 IIS。

于 2013-02-21T06:43:05.657 回答