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
    类 在中建立传输层连接 绑定通道
  • System.Net.Sockets
    是非托管WINSOCK API的包装器
  • 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默认值。