Adr*_*ian 11 .net c# wcf timeout
我有超时问题,这些是详细信息:
我的绑定配置如下所示:
<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>
Run Code Online (Sandbox Code Playgroud)
我正在向服务器发送一条消息,我知道该服务器已关闭,因此连接应该在我的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秒钟?
Chr*_*son 17
比@BiggsTRC更具体一点(答案大致正确):
System.Net.Sockets类在NetTcpBinding通道中建立传输层连接的细节委托给类;System.Net.Sockets 是非托管WINSOCK API的包装器;WSAConnect().NET Socket.Connect()方法使用的;System.ServiceModel.Channels.SocketConnectionInitiator.Connect())调用Socket.Connect,如果这会引发某些类型的异常,它会检查其连接超时期间是否有剩余时间.如果没有,你得到一个EndpointNotFoundException你看到的错误信息;TimeoutHelper类来跟踪超时时间并执行时间算术.这有一个被调用的方法ElapsedTime,但这是一个用词不当,因为它永远不会返回大于原始超时时间的值:这就是错误消息告诉您连接尝试花了多长时间的原因.WCF可以通过使用套接字API的异步方法来强制执行其配置的超时,监视单独线程上的超时以进行连接尝试,但它目前不这样做.如果您认为这是一个错误(可以说是它),您可以在Microsoft的Connect站点上报告它,也许可以在将来的版本或服务包中修复它.
我相信你现在正在处理Windows超时问题,而不是你的WCF超时.Windows将花费20-30秒来确定计算机在网络上没有响应.当您调用WCF服务器时,Windows首先必须建立到服务器的路由.当它不能时,它会警告您的软件,并且您的软件认为它已达到自己的超时.您的系统永远不会到达实际轮询点以查看服务是否正在运行,因为Windows仍在尝试在该IP地址的另一端找到某些内容.