WCF 未正确超时

本文关键字:超时 WCF | 更新日期: 2023-09-27 17:56:13

我遇到了超时问题,以下是详细信息:

我的绑定配置如下所示:

<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 秒?

WCF 未正确超时

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

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

WCF 可以使用套接字 API 的异步方法强制实施其配置的超时,在单独的线程上监视连接尝试的超时,但它当前没有这样做。如果您认为这是一个错误(可以说是),您可以在Microsoft的连接站点上报告它,并可能在将来的版本或服务包中修复它。

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

我遇到了同样的问题

做了每一件事,尝试了每一种配置都没有帮助。

互联网上的net.tcp在漫长的进程中像地狱一样超时

唯一对我有帮助的是当我使用

双工或回调消息交换模式

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