Web调用从不超时

4

我有许多应用程序使用各种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),而不是服务引用。也许切换到服务引用将带来更可靠的代码?无论如何,我正在尝试这样做,看看它是否至少修复了那些 Web 调用。 - mike
1个回答

4
我能猜测出它发生的原因,但无法给出解决方案 :(
我怀疑这是由于DNS解析导致的。我见过各种情况,其中“不计入” - 例如,在异步调用的初始线程上发生,或者在超时中肯定没有包含在内。
如果您能通过拔掉网络电缆来重现此问题,请使用Wireshark确认我的猜测 - 这将至少提示进一步的调查途径。也许在.NET堆栈中有一个DNS超时,通常是无限的,但可以进行微调。

有趣的信息,谢谢。我猜这可能是一些低层次的问题,很难处理。不幸的是,它很难复现,但我会尽力进一步调查。 - mike
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DNSQueryTimeouts: http://technet.microsoft.com/library/Cc977482 确定域名系统(DNS)客户端在名称解析过程中的五次尝试中等待响应的时间长度。 - Remus Rusanu
谢谢。在我的Windows 7或XP电脑上,我找不到名为DNSQueryTimeouts的条目。看起来默认值总共是15秒(这是我在其他地方读到的数字)。那么它应该默认为15秒?如果是这样的话,那就没问题了,因为15秒超时时间还可以接受。问题在于它从未超时并锁定线程(我认为也锁定了端口),这是我主要的问题。 - mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接