2013-02-26 111 views
6

對於聯繫有限組的其他服務器的C#web服務,我希望爲每個想要聯繫的服務器創建一個HTTP連接池。是否可以使用HTTP連接池?

課程的基本理念:

  • 每個池應打開幾個連接(可連接3個?)對其進行遠程Web服務器,並保持這些連接活着。
  • 應該使用最長生命週期來回收(斷開/重新連接)到遠程Web服務器的連接,從而防止遠程Web服務器在我們斷開之前斷開連接。
  • 不應該同時創建連接,而是在3個連接之間有一點暫停,這樣回收也不會同時發生。
  • 如果遠程網絡服務器仍然意外斷開連接,應該注意,我們應該重新連接。
  • 如果由於某種原因無法重新連接,應該稍後暫停重試。

這樣,當我想發送一個HttpWebRequest時,我已準備好使用連接,在我想使用它的時刻節省了建立連接的時間。

目前我不知道這是否甚至是HttpWebRequest的默認功能。很抱歉,如果我要求明顯的。谷歌搜索只爲我帶來類似的Java問題。

問題1:.NET/c#中存在這樣的事情嗎?

問題2:如果沒有,網上有這方面的資源,你知道嗎?

問題3:如果不是,自己如何建設一座?

+0

相關:[HTTP連接池(http://stackoverflow.com/questions/15077526/http-connection-pooling) – slugster 2013-02-26 09:47:23

+0

很抱歉,如果我誤解了你的問題,或者它的內容,而不是簡單地這樣做通過在.NET中使用WebSockets /長輪詢? SignalR會很好地工作。 – 2013-02-26 09:49:11

回答

3

HttpWebRequest(實質上是指.net中的所有Http API)已經使用連接池默認爲

如果您需要管理連接池的任何參數,請參閱ServicePointServicePointManager類。

+0

我一直在分析tcp數據包以找出發生了什麼。看起來HttpWebRequest確實重用了一個連接,如果它可以支持保持連接的話,但它不會主動嘗試保持連接。手動(沒有c#)我可以通過每10秒發送一個(是否沒有HTTP NOOP命令?!)簡單換行符「\ n」來保持與Apache的連接,以避免Apache達到超時,但我不能我認爲這是一種正式的做法。我也可以做一個HEAD請求,也應該保持連接活着,但需要Keep-Alive併產生更多的流量 – 2013-02-26 12:57:23

+0

我想看到的是保持連接活躍的c#(就像我能夠手動)。當它因任何原因斷開連接(達到超時,達到KeepAliveTimout,達到MaxKeepAliveRequests)時,c#將直接重新連接,而不是等到我想再次使用連接。 – 2013-02-26 13:04:52

+0

Ow和BTW。我可以看到HttpWebRequest一次又一次地使用同一個ServicePoint。並用httpWebRequest.ServicePoint.GetHashCode()確認它。但即使連接斷開,在您執行新請求之前,c#只是靜靜地重新連接並返回相同的散列碼。所以ServicePoint和哈希碼保持不變,但它是一個新的連接,不幸的是只有當你嘗試使用時才建立。 – 2013-02-26 13:09:45