2013-08-27 29 views
7

我使用作爲自託管進程運行的Web API創建了REST資源。出於性能原因,我希望能夠使用持久HTTP連接來調用它。我使用OWIN自託管。是否可以使用System.Net.Http.HttpClient的持久連接?

我真的很喜歡在System.Net.Http.HttpClient中的GET,POST,PUT,DELETE的asnyc方法。他們很容易調用和處理 - 他們返回一個System.Threading.Tasks.Task,這對我正在嘗試做的事很方便。我更喜歡使用HttpClient來System.Net.HttpWebRequest。

我可能錯過了一些東西,但對於我如何創建與HttpClient的持久連接並不明顯。我正在挖掘System.Net.Http.HttpClientHandler和System.Net.Http.WebRequestHandler類,但到目前爲止我還沒有找到持久連接的選項。 Google會發現使用HttpWebRequest創建持久連接的各種示例。它具有可以設置爲true的KeepAlive屬性。有沒有辦法使用HttpClient設置?

MSDN documentation for HttpClient

默認情況下,HttpWebRequest的將被用來發送請求到服務器。通過在以HttpMessageHandler實例爲參數的構造函數重載之一中指定不同的通道,可以修改此行爲。如果需要身份驗證或緩存等功能,則可以使用WebRequestHandler配置設置,並將實例傳遞給構造函數。可以將返回的處理程序傳遞給構造函數重載之一,並使用HttpMessageHandler參數。

有沒有辦法在底層HttpWebRequest上設置KeepAlive功能?

MSDN文檔還說:

HttpClient的類實例作爲一個會話來發送HTTP請求。 HttpClient實例是應用於該實例執行的所有請求的一組設置。另外,每個HttpClient實例都使用自己的連接池,將其請求與其他HttpClient實例執行的請求隔離開來。

我可以從中瞭解到,當獲得性能優勢時,連接池將使用持久連接爲我優化?如果我只想從我的客戶那裏獲得單一連接,該怎麼辦?

+0

嗨吧!你最終發現它是否可能? – vtortola

+0

自從我看了這個已經有一段時間了。據我所知,這是不可能的。我嘗試了很多東西,但不管我嘗試了什麼,http。系統在120秒後終止了我的連接,因爲它沒有流量。我從來沒有找到一種方法在.NET層配置連接,以便用HTTP KeepAlive或其他任何方法來修改這種低級行爲。我很樂意讓某人答案。 – petrsnd

+0

夠公平的。謝謝。 – vtortola

回答

0

我不確定你到底想要解決什麼問題,但是你看過SignalR嗎?他們有漂亮的websocket api,可以做你正在尋找的工作。

如果您不使用.NET 4.5,則它們確實有其他機制。我看到一個被使用的東西就像一個服務器/事件流。

+0

我不知道爲什麼-1,但如果你遵循我的建議,你可能會發現他們的IHttpClient實現有趣。 – Developer

0

您需要爲客戶端設置ServicePoint上的MaxIdle時間。最簡單的方法是設置超時所有服務點:

ServicePointManager.MaxServicePointIdleTime = Timeout.Infinite; 

您還可以設置它連接到特定端點

var sp = ServicePointManager.FindServicePoint(targetUri); 
sp.MasIdleTime = Timeout.Infinite;