WCF 没有正确超时?
Posted
技术标签:
【中文标题】WCF 没有正确超时?【英文标题】:WCF Not Timing out correctly? 【发布时间】:2011-08-23 09:43:34 【问题描述】:我遇到了超时问题,详情如下:
我的绑定配置如下所示:
<netTcpBinding>
<binding name="WindowsServerOverTcp"
maxReceivedMessageSize="10000000"
maxBufferSize="10000000"
maxBufferPoolSize="10000000"
closeTimeout="00:00:03"
openTimeout="00:00:03"
sendTimeout="00:00:03"
receiveTimeout="00:00:03">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
<security mode="None">
</security>
</binding>
</netTcpBinding>
我正在向我知道已关闭的服务器发送一条消息,因此连接应该在我的 app.config 中规定的 3 秒后超时,但由于某种原因,它需要 20-30 秒。
当 EndPointNotFoundException 被抛出时,这是我得到的信息:
System.ServiceModel.EndPointNotFoundException: 无法连接到 net.tcp://10.0.0.82:4466/MegaMatcherWcf。 连接尝试持续了 时间跨度为 00:00:03。 TCP错误代码 10060:连接尝试失败 因为关联方没有 一段时间后正确响应 时间,或建立连接失败 因为连接的主机未能 响应 10.0.0.82:4466
如果我在机器开启的情况下尝试相同的测试,但没有运行监听软件,我会得到预期的行为,连接会在 3 秒后超时。为什么机器关机需要 30 秒,然后告诉我需要 3 秒?
【问题讨论】:
【参考方案1】:比@BiggsTRC(其答案大致正确)更具体一点:
WCF 将详细信息委托给System.Net.Sockets
类
建立传输层连接
一个 NetTcpBinding 通道;
System.Net.Sockets
是非托管 WINSOCK API 的包装器;
WINSOCK API 具有内部默认超时,但没有提供任何记录机制来指定某些阻塞操作的超时,包括 .NET Socket.Connect()
方法使用的 WSAConnect()
;
WCF 代码(在System.ServiceModel.Channels.SocketConnectionInitiator.Connect()
中)调用Socket.Connect
,如果这引发了某些类型的异常,它会检查其连接超时期间是否还有剩余时间。如果没有,您会收到一个 EndpointNotFoundException
,其中包含您看到的错误消息;
WCF 使用TimeoutHelper
类来跟踪超时时间并进行时间算术。这有一个名为 ElapsedTime
的方法,但这是用词不当,因为它从不返回大于原始超时期限的值:这就是错误消息告诉您连接尝试花费了多长时间的原因。
WCF 可以通过使用 Sockets API 的异步方法来强制其配置的超时,监控连接尝试的单独线程上的超时,但它目前不这样做。如果您认为这是一个错误(可以说是),您可以在 Microsoft's Connect Site 上报告它,并可能在未来的版本或服务包中修复它。
【讨论】:
感谢您输入 Chris,我可能会报告这一点,因为提供一个不是有效连接超时的超时参数似乎有点疯狂。您会认为考虑到 MS 开发的 WCF,它们可以轻松覆盖 API 默认值。【参考方案2】:我相信您现在正在处理的是 Windows 超时问题,而不是您的 WCF 超时。 Windows 将需要 20-30 秒来确定计算机在网络上没有响应。当您调用 WCF 服务器时,Windows 首先必须建立到服务器的路由。如果不能,它会提醒您的软件,并且您的软件认为它已达到自己的超时。您的系统永远不会真正轮询以查看服务是否正在运行,因为 Windows 仍在尝试在该 IP 地址的另一端查找某些内容。
【讨论】:
澄清一下,我建立的每个连接都是一个新的连接,我并没有保留现有的连接。我会考虑考虑这是一项 Microsoft 技术,他们会在这种情况下覆盖默认的 TCP 超时?如果 connectTimeout 属性仅在机器开启时有效,那么它有什么意义? @Adrian - 令人沮丧,但我相信出现这种情况的原因是因为 WCF 让操作系统建立基本连接(获取服务器的路径)。这是让操作系统做它最擅长的事情。不幸的是,这意味着我们依赖于服务器关闭时的操作系统超时。 @BiggsTRC 感谢您提供的信息,真的让我很困惑,下次我会记住的!我将不得不将我所有的连接放到一个 SmartThread 池中,这样这些超时就不会减慢我的应用程序的速度。【参考方案3】:我遇到了同样的问题
做了所有的事情,尝试了所有的配置,没有任何帮助。
通过 Internet 的 net.tcp 在冗长的进程中像地狱一样超时
唯一对我有帮助的是我使用的时候
双工或回调消息交换模式
https://msdn.microsoft.com/en-us/library/ff395349.aspx
【讨论】:
以上是关于WCF 没有正确超时?的主要内容,如果未能解决你的问题,请参考以下文章