【发布时间】:2015-04-30 20:11:01
【问题描述】:
在实例化 HttpClient 时,一个常见的建议是:
但是,基于on this link,我看到了我认为暗示另一条规则的评论:
HttpClient 类实例充当发送 HTTP 请求的会话。 HttpClient 实例是应用于该实例执行的所有请求的设置集合。此外,每个 HttpClient 实例都使用自己的连接池,将其请求与其他 HttpClient 实例执行的请求隔离开来。
这让我想知道是否应该为我与之交互的每个服务端点创建一个 HttpClient 实例。 “服务端点”是指一个不同的基地址。以下每一项都是不同的“服务端点”:
- “http://foo.net/api/Message/”
- “http://bar.com/api/Message/”
- “http://wow.gov/api/Message/”
- “http://now.com/api/Message/”
- “http://mom.org/api/Message/”
- “http://dog.com/api/Message/”
当然,如果我打算使用 HttpClient 的“BaseAddress”属性,并且如果我正在处理并发调用,那么每个“服务端点”都需要一个 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/", ...);
上面的代码有效,这正是我正在构建的当前应用程序想要的。但是问题仍然存在……如果我将一个 HttpClient 用于我的应用程序与之通信的所有服务端点,我是否做错了什么?
我真的需要上面引用中提到的“连接池隔离”吗?
【问题讨论】:
-
因为我让许多端点共享同一个连接池。您能详细说明一下吗?端点是什么意思?你将如何使用
HttpClient?调用外部 HTTP 端点? -
从个人经验来看,我认为答案主要取决于你需要什么样的并发和吞吐量。我发现 HttpClient 的单个实例在一段时间后陷入困境,而多个实例 可以 提供帮助。话虽如此,如果有足够的容量,您将耗尽服务器的资源,可能需要横向扩展。
-
我已经修改了我的问题以澄清“服务端点”以及我关心的问题。是的,我将使用 HttpClient 调用外部 HTTP 端点。
标签: c# .net asp.net-web-api dotnet-httpclient