WCF没有正确定时?

时间:2011-05-11 14:55:03

标签: c# .net 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>

我正在向服务器发送一条消息,我知道该服务器已关闭,因此连接应该在我的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秒钟?

3 个答案:

答案 0 :(得分:16)

比@BiggsTRC更具体一点(答案大致正确):

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:1)

我遇到了同样的问题

每件事,尝试过每一种配置都没有任何帮助。

互联网上的net.tcp在漫长的过程中超时了

唯一帮助我的是我使用时

  

双工或回拨消息交换模式

https://msdn.microsoft.com/en-us/library/ff395349.aspx