在.NET C#中使用httpclient同时执行http请求

5

我已经制作了一个控制台应用程序,主要对我的服务器执行大量请求。每个用户10-15000个请求。

因此,我编写了这段代码,使用了.NET的HTTP Client库:

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();
}

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

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

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

有没有什么方法可以加速,使每秒完成10-100个请求?最大限制是多少?

有人能帮帮我吗?

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


3
你的测试可能并不特别有用。例如,HttpClient在任一时刻对同一服务器的连接数是受限制的(尽管你可以通过 ServicePointManager.DefaultConnectionLimit 来更改这个限制)。 - DavidG
@DavidG 你能给我展示一下具体怎么做和在哪里吗?是在这个方法里面还是别的地方? - User987
1
ServicePointManager.DefaultConnectionLimit是一个属性,@User987刚刚设置了它。 - Botonomous
1个回答

4

有没有办法让我加速处理,比如每秒钟执行10-100个请求?

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

或者最大限制是多少?

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

ServicePointManager.DefaultConnectionLimit = int.MaxValue;

我已经使用并行循环来加速这个过程。
这不是做这个工作的正确工具。您确实想要并发,但不是并行。异步并发可以使用Task.WhenAll表达:
var tasks = list.Select(item => DoRequest(item.Token));
await Task.WhenAll(tasks);

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

Stephen,我应该如何加载Task.WhenAll(tasks)的结果?在每个任务(task)中都有一个XML响应。我应该如何将它们加载到XMLDocument中呢? - User987
@User987 将连续任务链接到它们。让后续读取XML,然后在此之后进行任何您想要的操作。 - Botonomous
@User987: var results = await Task.WhenAll(tasks); 会得到一个 results 变量,其中包含一组 XML 响应。 - Stephen Cleary
@Stephen Cleary你如何做到这一点,但限制并发连接数? - user2966445
@Mohamed:Parallel 不能与 async 代码一起使用。 - Stephen Cleary
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接