WCF服务在第一次加载时响应413

时间:2013-02-20 02:49:51

标签: c# asp.net wcf wcf-binding

我有一个令人费解的问题,我无法找到答案。我正在尝试将大量数据上传到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且有效的soap响应

如果不增加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
}

1 个答案:

答案 0 :(得分:2)

好的发现了问题,并且为了参考起见,有人会遇到这样的问题:错误是初始SSL流量和IIS,而且似乎与WCF无关(我可能错了)。

必须增加IIS中的uploadReadAheadSize设置。

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

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