C# WCF未正确超时?
我遇到超时问题,以下是详细信息: 我的绑定配置如下所示:C# WCF未正确超时?,c#,.net,wcf,timeout,C#,.net,Wcf,Timeout,我遇到超时问题,以下是详细信息: 我的绑定配置如下所示: <netTcpBinding> <binding name="WindowsServerOverTcp" maxReceivedMessageSize="10000000" maxBufferSize="10000000" maxBufferPoolSize="10000000" closeTimeout="00:00:03" openTimeout="00:00:03" sendTim
<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:
无法连接到
净。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
是非托管WINSOCK API的包装器李>System.Net.Sockets
- WINSOCK API具有内部默认超时,但不提供任何有文档记录的机制来指定某些阻塞操作的超时,包括.NET
方法使用的Socket.Connect()
李>WSAConnect()
- WCF代码(在
中)调用System.ServiceModel.Channels.SocketConnectionInitiator.Connect()
,如果这引发特定类型的异常,它会检查连接超时期间是否有剩余时间。如果没有,您将得到一个Socket.Connect
,其中包含您看到的错误消息李>EndpointNotFoundException
- WCF使用一个
类来跟踪超时时间并执行时间算法。这有一个名为TimeoutHelper
的方法,但这是一个用词不当的方法,因为它从不返回大于原始超时时间的值:这就是错误消息向您显示连接尝试所用时间的原因ElapsedTime
WCF可以通过使用Sockets API的异步方法强制执行其配置的超时,监视连接尝试的单独线程上的超时,但目前它没有这样做。如果您认为这是一个bug(可以说是),您可以报告它,并可能在将来的版本或服务包中修复它。我也面临同样的问题 做每一件事,尝试每一种配置都没有任何帮助 internet上的tcp在漫长的进程中超时 唯一能帮助我的是当我使用 双工或回调消息交换模式
我要澄清的是,我建立的每个连接都是一个新的连接,我没有保留现有的连接。考虑到这是微软的技术,我会认为他们会在这种情况下覆盖默认的TCP超时?如果connectTimeout属性只在机器打开时才起作用,那么它有什么意义呢?@Adrian-这很令人沮丧,但我相信之所以会出现这种情况,是因为WCF让操作系统建立基本连接(获取到服务器的路径)。这就是让操作系统做它最擅长的事情。不幸的是,这意味着当服务器关闭时,我们依赖于操作系统超时。@BiggsTRC谢谢你提供的信息,真的让我很困惑,下次我会记得的!我必须将所有连接放到SmartThread池中,以便这些超时不会减慢我的应用程序。感谢您输入Chris,我可能会报告这一点,因为提供一个超时参数(不是有效的连接超时)似乎有点疯狂。您可能会认为,考虑到MS开发的WCF,它们可以轻松地覆盖API默认值。