最初我使用以下方法发送大量的URL:
for (...) {
using (var client = new HttpClient()) {
client.GetAsync(url);
}
}
原来,这是使用 HttpClient 的错误方式,因为 .Dispose 会使连接保留在另一侧,从而浪费服务器资源。建议的解决方法是使用共享的 httpClient 副本:
var client = new HttpClient();
for (...) {
client.GetAsync(url);
}
这种方法存在更严重的问题。如果您的目标url在负载均衡器后面,httpClient会与路由到的第一个盒子建立连接,并且每个后续请求都将发送到该盒子,忽略其余web farm中的内容。
那么正确的使用HttpClient的方法是什么呢?它可以避免浪费连接另一端的资源,并能够利用整个web farm?
HttpClient
对象,让它们独立并行地处理各自的“块”负载。否则,你实际上正在做恰好与keep-alive
旨在防止的事情相同。 - PrimeHttpClientFactory
; 它使用一组HttpClients并仅在DNS解析到相同的IP时重用连接。Josef Ottosson有一个很好的介绍。 - Dour High Arch