首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个服务的HttpClient实例-端点

每个服务的HttpClient实例-端点
EN

Stack Overflow用户
提问于 2015-04-30 20:11:01
回答 2查看 4.2K关注 0票数 18

在实例HttpClient时,一个常见的建议是:

然而,基于在这个链接上,我看到了评注,我认为这意味着另一条规则:

HttpClient类实例充当发送HTTP请求的会话。HttpClient实例是应用于该实例执行的所有请求的设置的集合。此外,每个HttpClient实例都使用自己的连接池,将其请求与其他HttpClient实例执行的请求隔离开来。

这让我想知道我是否应该为与我交互的每个服务端点创建一个HttpClient实例。所谓“服务端点”,我指的是一个独特的基址。以下每一个都是一个不同的“服务端点”:

当然,如果我打算使用HttpClient的“HttpClient”属性,如果我处理并发调用,那么我需要每个“服务端点”都有一个HttpClient实例。

然而,HttpClient确实允许我显式地指定一个绝对地址:

代码语言:javascript
复制
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,我做错了什么吗?

是否有理由真正需要上述引号中提到的“连接池隔离”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-30 20:21:53

但我想知道是否会危及HttpClient的内部工作,因为我让许多端点共享相同的连接池。

不,我不认为HttpClient的一个实例会耗尽您的资源,但这实际上取决于您将发出多少并发请求。HttpClient被设计为为并发请求服务,通过使用异步API的这类(XXXAsync),您可以实现这一点。

我建议不要忘记将ServicePointManager.DefaultConnectionLimit设置为更高的数字,因为它的默认值是2(并发请求)。

此外,如果您认为您会很快地碰到一个单一的实例,我建议一如既往地分析您的应用程序,以了解确切的瓶颈。

票数 2
EN

Stack Overflow用户

发布于 2018-12-21 18:58:01

我也面临着同样的问题。

我的调查结果如下:

  1. 如果您需要在请求期间更改HttpClient的非线程安全设置(DefaultRequestHeaders, BaseAddress),请使用单独的实例。为每个实例创建具有这些特定设置集的单独实例将是有用和安全的。更多细节:HttpClient-它真的是线程安全吗?
  2. 好的,我创建了HttpClient的特定实例,但我不打算使用BaseAdress。从第1点开始,我需要在每个惟一的HttpClient (主机)中使用新的BaseAdress实例。 但是,如果我通过绝对地址将HttpClient用于多个没有BaseAdress的主机的请求,该怎么办?您可以追逐从HttpClientSocketsHttpHanlderHttpConnectionPoolManager (dotnet源代码)的调用,并看到它为每个主机创建单独的'HttpConnectionPool‘,并将池添加到'ConcurrentDictionary’_pools。这意味着我们对每个唯一的主机都有单独的池。这就是为什么我更喜欢对多个主机使用单个HttpClient实例而不使用BaseAdress
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29976944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档