【发布时间】:2012-02-08 08:24:12
【问题描述】:
运行调用 WCF 服务的 MVC 网站。
2 台不同机器上的站点和服务。
.NET 框架 4; IIS 7。
生产站点在不应该超时的情况下遇到了超时。我创建了最简单的示例(调用服务方法的简单网站,该方法在延迟后返回“hi mom”)并且能够重现该问题。事情是这样的:
- 客户端 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 值。
- 确保在客户端和服务器上设置了 Compilation debug="false"(读取超时 [不确定哪些超时] 未正确遵守,除非已设置)。
- 增加了 maxBufferSize、maxBufferPoolSize 和 maxReceivedMessageSize,即使这与问题无关(服务器只返回“hi mom”)。
- 在客户端代理上的代码中明确设置 SendTimeout(因为这应该是相关的超时)。
- 从控制台应用调用服务(结果相同)。
我还能尝试什么?
[编辑] 将服务移到与 Web 应用程序相同的机器上,问题就消失了。
【问题讨论】:
标签: asp.net-mvc wcf iis-7 wcf-binding wcf-client