最初,我使用以下命令发送大量URL:
for (...) {
using (var client = new HttpClient()) {
client.GetAsync(url);
}
}
结果是使用HttpClient的wrong way,因为.Dispose将连接保留在另一侧,从而浪费了服务器资源。建议的解决方法是使用httpClient的共享副本:
var client = new HttpClient();
for (...) {
client.GetAsync(url);
}
这种方法遇到了更严重的问题。如果您的目标网址位于负载均衡器的后面,则httpClient会与其路由到的第一个框建立连接,并且每个后续命中都将忽略该Web场的其余部分转到该框。
那么使用HttpClient而不浪费资源在连接另一端并能够利用整个Web场的正确方法是什么?
答案 0 :(得分:0)
如果要使用多个HTTP连接,一个简单的解决方案将是这样的:
const int size = 12;
var clients = new HttpClient[size];
for (var i = 0; i < size; i++)
{
clients[i] = new HttpClient();
}
int j = 0;
for (...)
{
clients[j++%size].GetAsync(url); // todo: handle async correctly
}
如果您在ASP.NET Core应用程序内部,我敦促您考虑使用IHttpClientFactory。
如果您不使用IHttpClientFactory,请注意,如果在应用程序的生命周期内发生DNS更改,则该更改将不会得到体现。