2
运行调用WCF服务的MVC网站。
2台不同机器上的网站和服务。
.NET框架4; IIS 7.无法说明的WCF服务超时
生产站点在不应该时遇到超时。我创建了最简单的样本(简单的网站调用服务方法,延迟后返回“喂妈妈”),并能够重现问题。这是怎么回事:
- 客户端的web应用程序有它的绑定的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 =“false”(读取超时值[不确定哪些超时值]没有正确遵守,除非设置了此值)。
- 增加了maxBufferSize,maxBufferPoolSize和maxReceivedMessageSize,即使这与问题无关(服务器只是返回“hi mom”)。
- 在客户端代理上的代码中显式设置SendTimeout(因为这应该是相关的超时)。
- 从控制台应用程序调用服务(相同结果)。
我还能试试吗?
[编辑] 将服务移至与Web应用程序相同的机器,问题消失。