WCF 未正确超时
本文关键字:超时 WCF | 更新日期: 2023-09-27 17:56:13
我遇到了超时问题,以下是详细信息:
我的绑定配置如下所示:
<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 秒?
比@BiggsTRC更具体一点(其答案大致正确):
- WCF 将 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 可以使用套接字 API 的异步方法强制实施其配置的超时,在单独的线程上监视连接尝试的超时,但它当前没有这样做。如果您认为这是一个错误(可以说是),您可以在Microsoft的连接站点上报告它,并可能在将来的版本或服务包中修复它。
我相信您现在正在处理Windows超时问题,而不是WCF超时。 Windows 将需要 20-30 秒来确定计算机在网络上没有响应。 调用 WCF 服务器时,Windows 首先必须建立到服务器的路由。 当它不能时,它会提醒您的软件,您的软件认为它达到了自己的超时。 您的系统永远不会实际轮询以查看服务是否正在运行,因为 Windows 仍在尝试在该 IP 地址的另一端查找某些内容。
我遇到了同样的问题
做了每一件事,尝试了每一种配置都没有帮助。
互联网上的net.tcp在漫长的进程中像地狱一样超时
唯一对我有帮助的是当我使用
双工或回调消息交换模式
https://msdn.microsoft.com/en-us/library/ff395349.aspx