【问题标题】:web calls never timing out网络通话永远不会超时
【发布时间】:2011-03-03 17:39:11
【问题描述】:

我有许多应用程序使用各种 Web 技术,例如 SOAP、WCF 服务或只是简单的 XmlReader。但是,如果互联网连接在错误的时间出现问题,它们似乎都会遇到相同的问题,即错过超时和无限挂起。

我已将所有场景中的超时设置为较小的值,例如对于 wcf

closeTimeout="00:00:15" openTimeout="00:00:15" 
receiveTimeout="00:00:15" sendTimeout="00:00:15"

或肥皂

_Session.Timeout = (int)TIMEOUT.TotalMilliseconds;

这些超时通常会受到影响,但似乎有一些特殊情况,如果互联网在正确的时间掉线,调用将挂起并且永远不会超时(使用同步调用)。

我正在考虑每次拨打电话时启动一个计时器,并在计时器到期时使用适当的.Abort() 函数来取消呼叫。但是,我想知道是否有更简单的方法来解决问题并确保超时。

有谁知道为什么会发生这种情况,如果知道的话,有什么干净/简单/好方法可以确保调用始终超时?

【问题讨论】:

  • 新线索 - 我认为这可能与使用 Web 引用(看起来仅来自 .net 2)而不是服务引用有关。可能切换到服务引用会带来更可靠的代码?无论如何我都在尝试这个,看看它是否至少可以修复那些网络调用。

标签: c# web-services timeout


【解决方案1】:

我可以猜到为什么会发生,但没有给出解决方案:(

怀疑它正在追上 DNS 解析。我见过各种“不算数”的情况 - 例如它最终发生在异步调用的启动线程上,或者它绝对不包含在超时中。

如果您能够通过拔出网络电缆来重现这一点,我建议您使用 Wireshark 来确认我的猜测 - 这至少会提出进一步的调查途径。例如,可能在 .NET 堆栈中的某处存在 DNS 超时,该超时通常是无限的,但可以进行调整。

【讨论】:

  • 有趣的信息,谢谢。我认为这将是堆栈中难以处理的低点。不幸的是,它很难重现,但我会尝试进一步调查。
  • HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DNSQueryTimeouts:technet.microsoft.com/library/Cc977482 确定域名系统 (DNS) 客户端等待对名称解析过程中五次尝试中的每一次的响应的时间。
  • 谢谢。我在 Windows 7 或 XP 框中都找不到名为 DNSQueryTimeouts 的条目。看起来默认值加起来最多为 15 秒(这是我在其他地方读到的数字)。所以它应该默认为 15 秒?如果是这样,那没关系,不会成为问题,因为 15 秒超时就可以了。事实上,它从不超时并锁定一个线程(我也假设端口)这是我的主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2020-09-22
相关资源
最近更新 更多