在实例HttpClient时,一个常见的建议是:
然而,基于在这个链接上,我看到了评注,我认为这意味着另一条规则:
HttpClient类实例充当发送HTTP请求的会话。HttpClient实例是应用于该实例执行的所有请求的设置的集合。此外,每个HttpClient实例都使用自己的连接池,将其请求与其他HttpClient实例执行的请求隔离开来。
这让我想知道我是否应该为与我交互的每个服务端点创建一个HttpClient实例。所谓“服务端点”,我指的是一个独特的基址。以下每一个都是一个不同的“服务端点”:
当然,如果我打算使用HttpClient的“HttpClient”属性,如果我处理并发调用,那么我需要每个“服务端点”都有一个HttpClient实例。
然而,HttpClient确实允许我显式地指定一个绝对地址:
HttpClient client = new HttpClient(...);
client.PostAsJsonAsync("http://foo.net/api/Message/", ...);
client.PostAsJsonAsync("http://bar.com/api/Message/", ...);
client.PostAsJsonAsync("http://wow.gov/api/Message/", ...);
client.PostAsJsonAsync("http://now.com/api/Message/", ...);
client.PostAsJsonAsync("http://mom.org/api/Message/", ...);
client.PostAsJsonAsync("http://dog.com/api/Message/", ...);上面的代码可以工作,这正是我正在构建的当前应用程序所需要的。但是,remains...am这个烦人的问题,如果我对应用程序与之通信的所有服务端点使用一个HttpClient,我做错了什么吗?
是否有理由真正需要上述引号中提到的“连接池隔离”?
发布于 2015-04-30 20:21:53
但我想知道是否会危及HttpClient的内部工作,因为我让许多端点共享相同的连接池。
不,我不认为HttpClient的一个实例会耗尽您的资源,但这实际上取决于您将发出多少并发请求。HttpClient被设计为为并发请求服务,通过使用异步API的这类(XXXAsync),您可以实现这一点。
我建议不要忘记将ServicePointManager.DefaultConnectionLimit设置为更高的数字,因为它的默认值是2(并发请求)。
此外,如果您认为您会很快地碰到一个单一的实例,我建议一如既往地分析您的应用程序,以了解确切的瓶颈。
发布于 2018-12-21 18:58:01
我也面临着同样的问题。
我的调查结果如下:
HttpClient的非线程安全设置(DefaultRequestHeaders, BaseAddress),请使用单独的实例。为每个实例创建具有这些特定设置集的单独实例将是有用和安全的。更多细节:HttpClient-它真的是线程安全吗?HttpClient的特定实例,但我不打算使用BaseAdress。从第1点开始,我需要在每个惟一的HttpClient (主机)中使用新的BaseAdress实例。
但是,如果我通过绝对地址将HttpClient用于多个没有BaseAdress的主机的请求,该怎么办?您可以追逐从HttpClient到SocketsHttpHanlder到HttpConnectionPoolManager (dotnet源代码)的调用,并看到它为每个主机创建单独的'HttpConnectionPool‘,并将池添加到'ConcurrentDictionary’_pools。这意味着我们对每个唯一的主机都有单独的池。这就是为什么我更喜欢对多个主机使用单个HttpClient实例而不使用BaseAdress。https://stackoverflow.com/questions/29976944
复制相似问题