WCF没有正确定时?
我有超时问题,这些是详细信息:
我的绑定配置如下所示:
我正在向服务器发送一条消息,我知道该服务器已关闭,因此连接应该在我的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秒钟?
我相信你现在正在处理Windows超时问题,而不是你的WCF超时。 Windows将花费20-30秒来确定计算机在网络上没有响应。 当您调用WCF服务器时,Windows首先必须建立到服务器的路由。 当它不能时,它会警告您的软件,并且您的软件认为它已达到自己的超时。 您的系统永远不会到达实际轮询点以查看服务是否正在运行,因为Windows仍在尝试在该IP地址的另一端找到某些内容。
比@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
,如果这会引发某些类型的exception,它会检查连接超时期间是否有剩余时间。 如果没有,则会收到EndpointNotFoundException
并显示您看到的错误消息; - WCF使用
TimeoutHelper
类来跟踪超时时间并执行时间算术。 这有一个名为ElapsedTime
的方法,但这是一个用词不当,因为它永远不会返回大于原始超时时间的值:这就是错误消息告诉您连接尝试花了多长时间的原因。
WCF可以通过使用套接字API的异步方法来强制执行其配置的超时,监视单独线程上的超时以进行连接尝试,但它当前不会这样做。 如果您认为这是一个错误(可以说是它),您可以在Microsoft的Connect站点上报告它,也许可以在将来的版本或服务包中修复它。
我遇到了同样的问题
做过每一件事,尝试过每一个配置没什么用。
互联网上的net.tcp在冗长的进程中超时
唯一帮助我的是我使用的时候
双工或回拨消息交换模式