WCF没有正确定时?

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更具体一点(答案大致正确):

  • WCF将System.Net.Sockets类在NetTcpBinding通道中建立传输层连接的细节委托给类;
  • System.Net.Sockets 是非托管WINSOCK API的包装器;
  • WINSOCK API具有内部默认超时,但没有提供任何记录的机制来指定某些阻塞操作的超时,包括WSAConnect().NET Socket.Connect()方法使用的;
  • WCF代码(in System.ServiceModel.Channels.SocketConnectionInitiator.Connect())调用Socket.Connect,如果这会引发某些类型的异常,它会检查其连接超时期间是否有剩余时间.如果没有,你得到一个EndpointNotFoundException你看到的错误信息;
  • WCF使用TimeoutHelper类来跟踪超时时间并执行时间算术.这有一个被调用的方法ElapsedTime,但这是一个用词不当,因为它永远不会返回大于原始超时时间的值:这就是错误消息告诉您连接尝试花了多长时间的原因.

WCF可以通过使用套接字API的异步方法来强制执行其配置的超时,监视单独线程上的超时以进行连接尝试,但它目前不这样做.如果您认为这是一个错误(可以说是它),您可以在Microsoft的Connect站点上报告它,也许可以在将来的版本或服务包中修复它.


IAm*_*rey 9

我相信你现在正在处理Windows超时问题,而不是你的WCF超时.Windows将花费20-30秒来确定计算机在网络上没有响应.当您调用WCF服务器时,Windows首先必须建立到服务器的路由.当它不能时,它会警告您的软件,并且您的软件认为它已达到自己的超时.您的系统永远不会到达实际轮询点以查看服务是否正在运行,因为Windows仍在尝试在该IP地址的另一端找到某些内容.