我有许多使用各种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()
功能取消呼叫。但是,我想知道是否有更简单的方法来解决问题并确保超时被击中。
有谁知道为什么会发生这种情况,如果有的话,干净/简单/好的方法是什么,以确保电话总是超时?
答案 0 :(得分:4)
我可以猜到为什么它会发生,但没有给出解决方案:(
我怀疑它正在陷入DNS解析。我已经看到了“不计算”的各种情况 - 例如它最终发生在异步调用的启动线程上,或者它绝对没有包含在超时中。
如果您能够通过拔出网线重现这一点,我建议使用Wireshark来确认我的猜测 - 这至少可以提出进一步的调查途径。也许在.NET堆栈的某处有一个DNS超时,通常是无限的,但可以调整,例如。