无法解释的WCF服务超时

时间:2012-01-11 23:55:48

标签: asp.net-mvc wcf iis-7 wcf-binding wcf-client

运行调用WCF服务的MVC网站 2台不同机器的现场和服务 .NET框架4; IIS 7.

生产站点遇到超时时不应该。我创建了最简单的样本(简单的网站,称为服务方法,返回"嗨妈妈"延迟后),并能够重现问题。这是怎么回事:

  • 客户端网络应用将其绑定的SendTimeout设置为6分钟。
  • 服务器服务除了向文件写入消息,休眠5分钟,写下另一条消息外什么都不做。
  • 写入服务器上文件的消息是正确的;服务器跟踪显示没有问题。
  • 客户端永远不会从服务器服务方法接收返回值。它只是失去了它与服务器的连接。
  • 客户端在6分钟后抛出TimeoutException(任何超时时间超过该延迟都会进一步延迟异常)。 如果我将服务器上的线程休眠时间更改为4分钟,一切正常。这是可重复的,没有其他人可以搞乱这个测试场景。

所以这是客户端的相关配置部分:

    <binding name="BasicHttpBinding_IService1"
             closeTimeout="00:6:00"
             openTimeout="00:6:00"
             receiveTimeout="00:6:00"
             sendTimeout="00:6:00"
             allowCookies="false"
             bypassProxyOnLocal="false"
             hostNameComparisonMode="StrongWildcard"
             maxBufferSize="2147483647"
             maxBufferPoolSize="2147483647"
             maxReceivedMessageSize="2147483647"
             messageEncoding="Text"
             textEncoding="utf-8"
             transferMode="Buffered"
             useDefaultWebProxy="true">

<httpRuntime executionTimeout="1200"
             maxRequestLength="10240" />

  <serviceBehaviors>
    <behavior>
      <serviceTimeouts transactionTimeout="00:6:00" />
    </behavior>
  </serviceBehaviors>

服务器上存在相同的值。 以下内容包括我尝试的内容:

  • 添加了上面的serviceTimeouts元素。
  • 确保在客户端代理类上调用close(即使在我的情况下这不是问题,因为每次都会发生错误)。
  • 明确创建频道,投射为IContextChannel并设置OperationTimeout(如here所示)。
  • 增加了IIS中服务器应用程序池的FailureInterval属性。
  • 确保配置中绑定元素的所有超时值都设置为大于服务方法所用时间的值。
  • 创建一个ChannelFactory并设置它的Endpoint.Binding.SendTimeout值。
  • 确保编译debug =&#34; false&#34;在客户端和服务器上设置(读取超时[不确定哪些超时]未正确遵守,除非已设置)。
  • 增加了maxBufferSize,maxBufferPoolSize和maxReceivedMessageSize,即使这不应该与问题有关(服务器只是返回&#34;嗨妈妈&#34;)。
  • 在客户端代理上的代码中显式设置SendTimeout(因为这应该是相关的超时)。
  • 从控制台应用程序调用该服务(结果相同)。

我还能尝试什么?

[编辑] 将服务移动到与Web应用程序相同的计算机上,问题就消失了。

1 个答案:

答案 0 :(得分:1)

生产环境中的防火墙上的HTTP策略:最长请求时间为5分钟。