每个服务端点的 HttpClient 实例化

2024-01-04

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

  • 使用单例,每次使用后不要丢弃 https://stackoverflow.com/questions/22560971/what-is-the-overhead-of-creating-a-new-httpclient-per-call-in-a-webapi-client.

然而,基于在这个链接上 https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx我看到评论,我认为这暗示着另一条规则:

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

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

  • "http://foo.net/api/Message/ http://foo.net/api/Message/"
  • "http://bar.com/api/Message/ http://bar.com/api/Message/"
  • "http://wow.gov/api/Message/ http://wow.gov/api/Message/"
  • "http://now.com/api/Message/ http://now.com/api/Message/"
  • "http://mom.org/api/Message/ http://mom.org/api/Message/"
  • "http://dog.com/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 因为我让许多端点共享相同的连接 水池。

不,我认为没有一个实例HttpClient会耗尽您的资源,但这实际上取决于您将发出多少并发请求。HttpClient旨在服务并发请求,并通过使用异步 API 等(XXXAsync),您就可以实现这一目标。

我建议不要忘记设置ServicePointManager.DefaultConnectionLimit https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit(v=vs.110).aspx到更高的数字,因为它的默认值为 2(并发请求)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个服务端点的 HttpClient 实例化 的相关文章

随机推荐

  • 如何使用 servlet 中的保存文件对话框?

    我试图让用户将 servlet 中的数据保存为 CSV 文件 最初我只是找到他们的桌面来放置文件 但此路线的权限会被拒绝 所以我想询问用户他们想要将文件保存在哪里 据我所知 我无法在 servlet 中使用 Swing API 因为 Tom
  • 点在函数中获取“脚本”

    我的 PowerShell 配置文件变得有点麻烦 我发现我并不总是使用其中的所有内容 我想减小我的个人资料的大小并加快启动时间 但我仍然希望能够访问这些功能相对地当我需要它们时很快 有没有办法 点源 https en wikipedia o
  • Cuda char* 变量赋值

    这是本文所选答案的后续问题 cuda程序的输出不是预期的 https stackoverflow com questions 6561005 output of cuda program is not what was expected 6
  • 清除 HTML 画布中形状下的像素

    我正在使用 HTML 画布和 javascript 并且需要清除通过关闭路径创建的形状下方的所有像素 例如 我正在使用flot http code google com p flot 并且我想制作圆角 为此 我首先需要通过在角的顶部绘制一条
  • Maven 创建一个空文件夹而不是获取适当的 .jar

    Maven 创建一个空文件夹而不是获取适当的 jar 我有一个由 3 个模块组成的项目 其中一个模块是其他两个模块的公共部分 当两个模块生成 WAR 文件时 第三个模块必须生成一个 JAR 该 JAR 应该嵌入到其他两个 WEB INF l
  • Magento CMS 错误:前端控制器达到 100 次路由器匹配迭代

    当我通过 CMS 在管理中 创建页面时 一切看起来都很好 但是当我尝试访问前端中的页面时 我得到一个带有错误的空白页面 Front controller reached 100 router match iterations 0 app c
  • NoSQL 的用例[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 NoSQL 最近在我们行业受到了广泛的关注 我真的很感兴趣人们对它在关系数据库存储上的最佳用例的看法 什么会促使开发人员认为特定数据集更适合 N
  • 在 Git 中的根提交之前插入非空提交?

    我有一个问题 请各位好心人指教 我有一个现有的 git 存储库 并且由于各种原因 我不会在这里讨论 我正在尝试创建一个 ROOT 提交 假设这是我的 git 提交历史记录 ROOT C1 lt C2 lt C3 lt C4 lt C5 lt
  • jQuery:如何制作一个清晰的按钮?

    我有一个搜索字段 我需要一个清晰的按钮 我目前有按钮 但我不知道该怎么做 我有 6 个文本字段 2 个组合框和 2 个多选列表 如何在一个清除函数中清除所有这些 我知道 HTML 方式 但我使用 Grails 并且 type reset 不
  • 如何使用 Chart.js 更改 Barchart 中仅一列的颜色

    js http www chartjs org docs bar chart http www chartjs org docs bar chart 我正在使用基本示例 HTML
  • 是否可以在单手柄 jQuery UI 滑块上设置固定的静态范围?

    本质上我要做的是一个用于一堆日期的单句柄 jQuery UI 滑块 选择的日期范围始终为两周 我想做的只是显示从两周范围的开始日期 即句柄驻留的日期 开始的一个范围 该范围不必是功能性的 只是显示 向前两周 这个范围是固定的 例如 如果句柄
  • 从 Eclipse 远程部署 Tomcat Web 应用程序

    出于开发和测试目的 我想将我的 web 应用程序从 eclipse 部署到远程 tomcat 服务器 这可能吗 如果没有 我应该如何设置我的开发环境以实现顺利 轻松的远程部署 如果您可以远程访问 Tomcat 管理器应用程序 那么您可以使用
  • 让用户选择他希望程序使用多少个线程

    我想让一个程序读取 txt 文件的每一行 并对每一行执行一些操作 我希望用户能够选择线程 因此如果他选择 10 个线程 那么程序将能够同时在 10 行上执行某些操作 假设文本文件包含 1 000 000 行 我该怎么办 这就是我实际上所拥有
  • 如何确定 connectNative 是失败还是成功

    我已成功将我的扩展连接到我们的本机主机 var pulse tracker port chrome runtime connectNative com cloudfactory pulsetracker 但我如何知道连接是否成功呢 无论连接
  • Xcode 5“缺少编译器规范 LLVM 4.2”错误

    我目前正在尝试在 Xcode 5 中构建我的项目 构建失败并出现错误 依赖性分析错误 missing compiler specification
  • 抽象工厂设计模式

    我正在为我的公司开发一个内部项目 该项目的一部分是能够将 XML 文件中的各种 任务 解析为稍后运行的任务集合 由于每种类型的任务都有许多不同的关联字段 因此我决定最好用单独的类来表示每种类型的任务 为此 我构造了一个抽象基类 public
  • 输入上的 v-model 通过其他脚本动态更改值?

    我有两个输入 用于存储来自谷歌地图脚本的纬度和经度 如果用户更改标记的位置 gt 这两个输入将获取用户所啄的纬度和经度 所以我想获取这两个输入的值 我尝试了 v model 但它不起作用我实际上注意到 只有当我通过键入或粘贴某些内容来更改这
  • CMD.EXE 批处理脚本显示 txt 文件中的最后 10 行

    有什么想法如何回显或输入 txt 文件的最后 10 行吗 我正在运行服务器更改日志脚本来提示管理员说明他们正在做什么 以便我们可以跟踪更改 我试图让脚本显示最近 10 个条目左右 以了解最近发生的情况 我找到了一个处理最后一行的脚本 如下所
  • Android 从gridview布局索引转换成行和列

    如果我有从 0 开始的网格上位置的索引 如何将其转换为行 列 我得到以下错误结果 幸运的是 我知道我有多少行和列 在我的例子中是 11 x 11 int column position columns int row position co
  • 每个服务端点的 HttpClient 实例化

    实例化 HttpClient 时 一个常见的建议是 使用单例 每次使用后不要丢弃 https stackoverflow com questions 22560971 what is the overhead of creating a n