使用HttpClient
的推荐方法是创建一个实例并共享它(根据Microsoft文档)。有很多例子,每个请求(在服务器上)使用HttpClient
会产生问题。
在我的情况下,我必须同时运行20个“会话”,这些会话不会相互干扰。 “会话”是指服务或多个服务上的隔离操作集。这些会话之间不应共享数据,特别是cookie。
这些会议是持久的会议(可以持续数天)。但同时可能最多只有20个并发会话。实例化这些会话时启动缓慢(最多5秒)。
我应该使用游泳池吗?我应该重用相同的HttpClient
实例吗?我应该最多产生20 HttpClient
个?此外,考虑到它们同时运行,假设对单个HttpClient
的并发调用将被阻塞是否正确?
答案 0 :(得分:0)
仅创建HttpClient
的单个实例的建议是因为它创建了一段持续一段时间的TCP连接。最终,它会自动收集或关闭,但与此同时,您可能会耗尽服务器上最大量的打开连接。还有一些来自每个连接的资源利用率在堆叠时可能会出现问题。
然而,这是没有硬性规定的事情之一。某些事情,比如为每个操作创建一个新的HttpClient
,显然是有问题的,但通常每个请求服务器的一个实例(不是每个通过HttpClient
发送的请求)都不会有问题,除非您&# 39;重新服务大量的并发请求。
您也可以在应用程序中将其设为单例。从技术上讲,HttpClient
不是用户或会话特定的事情。如果您更改的默认标头不应跨会话泄露,则只会出现问题。例如,您希望在创建请求时附加类似Authorization
标头的内容,而不是在设置客户端时附加默认标头。只要您对如何使用它很聪明,分享它就没有问题。那就是你如何使用它"但事情有时可能是一个失败点。即使你是,下一个开发人员也会。更重要的是,他们甚至会知道他们应该吗?你甚至可能会忘记自己。
就个人而言,我开始将其设置为请求范围,其中对Web应用程序的每个请求都获得一个单独的实例,但在该请求期间,同一个实例将用于HttpClient
的所有操作。然后,您可以进行一些分析以查看服务器如何处理此问题,如果它确实成为问题,那么您可以寻找替代解决方案。