如何防止从WCF服务winform客户端的超时响应

时间:2013-04-25 17:40:42

标签: winforms wcf timeout

我有一个winform客户端调用的WCF服务方法。客户端将几个字符串传递给该方法,然后该方法执行一系列操作,这可能需要超过20分钟。 在进程大约15分钟后,客户端收到TCP连接已终止的响应。 WCF服务继续处理超过此点,直到完成作业。 我已将客户端绑定配置中的超时设置为每个30分钟。我还将编译批处理超时设置为30分钟。 WCF服务向客户端返回一个字符串,只是说“成功”,因此它不是关于传输的大小问题。由于某些超时,似乎IIS正在终止TCP连接。

接收到http://xxxxxxxxxxxxx.svc的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。请参阅服务器日志以获取更多详内部异常:基础连接已关闭:接收时发生意外错误。内部异常:无法从传输连接读取数据:远程主机强制关闭现有连接。内部异常:远程主机强制关闭现有连接

有任何帮助吗?该错误由winform客户端生成,而不是wcf service btw。

以下是绑定设置:

<wsHttpBinding>
  <binding name="WSHttpBinding_STUFFGOESHERE" closeTimeout="00:30:00"
   openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
   bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
   maxBufferPoolSize="524288000" maxReceivedMessageSize="65536" messageEncoding="Text"
   textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
   <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
   <reliableSession ordered="true" inactivityTimeout="00:30:00"
    enabled="false" />
   <security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
    realm="" />
   <message clientCredentialType="Windows" negotiateServiceCredential="true"
    algorithmSuite="Default" />
  </security>
 </binding>
 </wsHttpBinding>

1 个答案:

答案 0 :(得分:0)

您是否在httpbinding上设置了超时? 在代码中:

((WSHttpBinding)binding).OpenTimeout = new TimeSpan(0, 1, 0);
((WSHttpBinding)binding).CloseTimeout = new TimeSpan(0, 1, 0);
((WSHttpBinding)binding).SendTimeout = new TimeSpan(0, 30, 0);
((WSHttpBinding)binding).ReceiveTimeout = new TimeSpan(0, 30, 0);

或在服务配置文件

<bindings>
  <wsHttpBinding>
    <binding openTimeout="00:1:00" 
             closeTimeout="00:1:00" 
             sendTimeout="00:30:00" 
             receiveTimeout="00:30:00">
    </binding>
  </wsHttpBinding>
</bindings>

另见http://msdn.microsoft.com/en-us/library/hh924831.aspx