用HttpClient发送大量请求的最快,最安全的方法是什么?

时间:2019-05-30 21:55:37

标签: c# .net .net-core

最初,我使用以下命令发送大量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场的正确方法是什么?

1 个答案:

答案 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更改,则该更改将不会得到体现。