【问题标题】:Performing concurrently http requests using httpclient in .NET C#在 .NET C# 中使用 httpclient 并发执行 http 请求
【发布时间】:2017-08-13 14:06:49
【问题描述】:

我制作了一个控制台应用程序,它基本上对我的服务器执行大量请求。每个用户 10-15000 个请求。

所以我编写了这段代码,它使用 .NET 的 HTTP 客户端库:

public async Task<string> DoRequest(string token)
{

var request = new HttpRequestMessage(HttpMethod.Post, "mysite.com");
string requestXML = "my xml request goes her...";
request.Content = new StringContent(requestXML, Encoding.UTF8, "text/xml");
var response = await httpClient.SendAsync(request);
return await response.Content.ReadAsStringAsync();
}

所以现在我正在尝试每 1 秒执行尽可能多的 HTTP 请求...我不知道这个上限是多少,所以我使用了并行 for 循环来加快速度:

Parallel.For(0,list.Count(),items=>{
DoRequest(item.Token);
});

但我对代码的速度和请求的发出方式不是很满意...

有什么方法可以加快速度,每 1 秒最多可以处理 10-100 个请求?或者最大限制是多少?

有人可以帮帮我吗?

附:伙计们,我只创建了一个 httpclient 类的实例,因为我读到只创建一个是一个好习惯,因为每次创建此类的新对象时,连接都会关闭,这不是我们想要的吗?

【问题讨论】:

  • 您的测试可能不是特别有用。例如,HttpClient 被限制为在任何时候与同一服务器的连接数(尽管您可以使用 ServicePointManager.DefaultConnectionLimit 更改)
  • @DavidG 你能告诉我具体怎么做以及在哪里做吗?还是用同样的方法?
  • ServicePointManager.DefaultConnectionLimit 是 @User987 的属性,只需设置即可。

标签: c# asp.net request console-application dotnet-httpclient


【解决方案1】:

有什么方法可以让我加快速度,每 1 秒最多可以处理 10-100 个请求?

这是一个无法回答的问题。

或者最大限制是多少?

正如大卫所说,您需要设置ServicePointManager.DefaultConnectionLimit。这应该足以作为 Main 方法中的第一行:

ServicePointManager.DefaultConnectionLimit = int.MaxValue;

我使用了并行 for 循环来加快速度

这对这项工作来说是不正确的工具。您确实需要并发性,但不需要并行性。异步并发使用Task.WhenAll表示:

var tasks = list.Select(item => DoRequest(item.Token));
await Task.WhenAll(tasks);

我只创建了一个 httpclient 类的实例,因为我读到最好只创建一个,因为每次创建此类的新对象时,连接都会关闭,这不是我们想要的吗?

没错。

【讨论】:

  • Stephen,我将如何实际加载 Task.WhenAll(tasks) 的结果?每个任务内部都有一个 XML 响应。那么我将如何将它们加载到 XMLDocument 中?
  • @User987 将任务链延续给他们。让继续阅读 XML 并在之后用它做任何你想做的事情。
  • @User987: var results = await Task.WhenAll(tasks); 会得到一个 results 变量,它是一个 XML 响应数组。
  • @Stephen Cleary 如果限制并发连接数,你会怎么做?
  • 您可以使用 DefaultConnectionLimit 或 SemaphoreSlim(SO 上有几个示例)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多