【发布时间】:2018-02-01 11:31:03
【问题描述】:
上下文
使用HttpClient 的推荐方法是创建一个实例并共享它(根据Microsoft 文档)。有很多例子表明每个请求(在服务器上)使用 HttpClient 会产生问题。
问题
在我的情况下,我必须同时运行多达 20 个不能相互干扰的“会话”。 “会话”是指对一个服务或多个服务的独立操作集。不应在这些会话之间共享任何数据,尤其是在 cookie 之间。
这些会话是持久的会话(可以持续数天)。但同时最多只能有 20 个并发会话。实例化这些会话时启动缓慢是可以接受的(最多 5 秒)。
问题
我应该使用游泳池吗?我应该重复使用相同的HttpClient 实例吗?我应该最多生成 20 个HttpClients 吗?此外,考虑到它们同时运行,假设对单个HttpClient 的并发调用将被阻塞是否正确?
【问题讨论】:
-
这取决于你的服务器在做什么。如果它没有为其他应用程序使用大量的 TCP 连接,那么 20 个 HttpClient 实例,每个都有一个会话。
-
@Crowcoder 它是一个 GraphQL API 服务器,因此它将接收大量通过 ASP.NET Core 2 处理的 HTTP POST 请求。
-
然后我会尝试使用单个客户端,但通过
HttpRequestMessage改变请求,而不是在客户端本身上设置任何属性。 See my blog 接收者。 -
@Crowcoder 通过使用单个实例,我实际上可以并行使用客户端,还是会阻塞直到另一个会话完成上一个请求?
-
它不会阻塞,它被设计为多线程访问。只是不要通过在任何调用中添加
.Result或.Wait()来阻止自己,一切都应该完全异步。
标签: c# asp.net asp.net-core concurrency httpclient