2011-11-18 46 views
1

我正在使用第三方庫進行多次http調用。通過對代碼進行反編譯,我確定它正在創建並使用原始的HttpWebRequest,所有這些都將轉到單個URL。問題是有些請求沒有正確關閉。一段時間後,當庫調用GetRequestStream()*時,所有新的HttpWebRequest都會永久阻塞。我確定這個阻塞是由於ServicePoint上的ConnectionLimit對於那個具有默認值2的特定主機。換句話說,庫已經打開了2個請求,然後嘗試打開第3個阻塞。ServicePoint安全檢查以防止阻止新的HttpWebRequests

我想防止這種阻塞。該庫具有相當的彈性,並且會自行重新連接,所以如果我殺死它所建立的現有連接就沒關係。問題是我沒有權限訪問該庫中的任何HttpWebRequestHttpWebResponse。但是我知道它訪問的URL,因此我可以訪問ServicePoint

var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com")); 

(注:保持活動是在這些HttpWebRequests啓用)

+1

如果你解決了你的問題,請寫出你拿了別人的步驟誰可能會發現自己在今後類似的情況有幫助的解釋。謝謝。 – Sampson

+0

@jonathan我做了一個有根據的猜測,並在解決方案中提出了我的問題中的3個步驟,並最終開始工作。什麼是混亂? – dan

+0

你的答案不能獨立存在。你說過:「我做到了,而且有效。」讀者仍然想知道「this」和「it」是指什麼,這在刪除之前留下的評論中很明顯。請隨時寫出能夠自立的答案。謝謝。 – Sampson

回答

1

這個工作,雖然我不知道這是解決問題的最好辦法。

  1. 獲取服務點對象的URL
    var sp = ServicePointManager.FindServicePoint(new Uri("http://UrlThatIKnowAbout.com"));
  2. 增加ConnectionLimitint.MaxValue
  3. 創建一個後臺線程定期檢查該服務點的ConnectionCount。如果這樣下去,高於5,撥打CloseConnectionGroup()
  4. 設置MaxIdleTime至1小時(而不是默認)

設置ConnectionLimit應防止阻塞。監視器線程將確保太多的連接不會同時處於活動狀態。設置MaxIdleTime應該作爲回退。