HttpClient
已經(jīng)設(shè)計用于多個呼叫。..甚至跨越多個線程。這個HttpClientHandler
具有可跨調(diào)用重用的憑據(jù)和Cookies。有新的HttpClient
比如需要重新設(shè)置所有的東西。此外,DefaultRequestHeaders
屬性包含用于多個調(diào)用的屬性。必須在每個請求上重置這些值,這一點就失敗了。
另一個主要好處是HttpClient
是添加以下內(nèi)容的能力HttpMessageHandlers
在請求/響應(yīng)管道中應(yīng)用橫切關(guān)注點。它們可以用于日志記錄、審計、節(jié)流、重定向處理、脫機處理、捕獲度量。各種各樣的東西。如果在每個請求上創(chuàng)建了一個新的HttpClient,那么需要在每個請求上設(shè)置所有這些消息處理程序,并且還需要提供這些處理程序請求之間共享的任何應(yīng)用程序級狀態(tài)。
的特性使用得越多。HttpClient
,您將更多地看到重用現(xiàn)有實例是有意義的。
但是,最大的問題,在我看來是,當HttpClient
類被處理,它處理HttpClientHandler
,然后強行關(guān)閉TCP/IP
管理的連接池中的連接。ServicePointManager
..這意味著每個請求都有一個新的HttpClient
需要重新建立一個新的TCP/IP
連接。
根據(jù)我的測試,在LAN上使用普通HTTP,性能的影響是可以忽略不計的。我懷疑這是因為有一個底層的tcp保持活動,即使在以下情況下,該連接仍然處于打開狀態(tài)。HttpClientHandler
試圖關(guān)閉它。
在互聯(lián)網(wǎng)上的請求中,我看到了一個不同的故事。由于每次都必須重新打開請求,我已經(jīng)看到了40%的性能下降。
我懷疑HTTPS
聯(lián)系會更糟。
我的建議是在應(yīng)用程序的生存期內(nèi)保留一個HttpClient實例對于您連接到的每個不同的API。