2011-02-24 64 views
4

我有許多應用程序使用各種網絡技術,如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

新的領導 - 我認爲這可能與使用web引用(看起來像只來自.net 2)而不是服務引用有關。可能切換到服務引用將帶來更可靠的代碼?無論如何,我正在嘗試這種方式,看看它是否至少可以修復這些網絡電話。 – mike 2011-03-06 23:01:30

回答

4

我猜爲什麼這樣的情況,但沒有給出一個解決方案:(

嫌疑它陷入了DNS解析。我已經看到了各種情況下的是「不計「 - 例如它最終發生在異步調用的啓動線程上,或者它絕對不包含在超時中。

如果你能夠通過拔出網絡電纜來重現此問題,我會建議使用Wireshark來確認我的猜測 - 這至少會提供進一步調查的途徑,也許有一個DNS超時som例如,在.NET堆棧中,這通常是無限的,但可以進行調整。

+0

有趣的信息,謝謝你。我認爲這將是一個很難處理的低點。不幸的是,它很難複製,但我會盡力進一步調查。 – mike 2011-02-25 01:45:26

+0

'HKLM \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ DNSQueryTimeouts':http://technet.microsoft.com/library/Cc977482確定域名系統(DNS)客戶端等待對五個響應中的每一個響應的時間嘗試進行名稱解析過程。 – 2011-03-02 16:36:17

+0

謝謝你。我無法在我的Windows 7或XP盒子中找到名爲DNSQueryTimeouts的條目。它看起來像默認加起來15秒(這是我讀過的其他數字)。所以它應該只默認15秒?如果是這樣,那麼不會成爲問題,因爲15秒的超時時間沒問題。這是事實,它從來沒有超時和鎖定一個線程(我也假設端口),這是我的主要問題。 – mike 2011-03-02 22:50:01