在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

修复.NET 的 HttpClient

  • 2018-03-04
  • 本文字数:1081 字

    阅读完需:约 4 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

早在 2016 年我们就报道过 ,.NET 的HttpClient 存在一些问题。随着.NET Core 2.1 中HttpClientFactory 的引入,其中部分问题已经得到缓解。

HttpClient 的根本问题是,每次调用资源好像都应该在使用后立即释放。在现实中,那意味着每个目标服务器都要创建一次,然后在应用程序运行期间一直保留。除非是,比如说,需要清理 DNS 缓存。

新增的 HttpClientFactory 让用户可以在应用程序启动时预先配置 HttpClient。每项配置都有名称,让使用正确的配置请求 HttpClient 变得简单。为了防止用户不需要自定义配置,它也提供了未命名配置。

考虑到字符串容易出错,HttpClient 的配置可以指定为特定的类型。例如,用户可以创建 GitHubService 类配置。然后,DI 框架会确保为使用那个配置而非默认配置的 HttpClient 提供 GitHubService 实例。

这个管理 HttpClient 的新框架不会改变基本的使用规则:销毁 HttpClient 仍然是危险的。对于 DNS 缓存问题,Karel Zikmund 写到:

我们正在积极地讨论设计,以期直接在 ManagedHandler 中解决 DNS 变化问题。目前,我们正在考虑两个选项:要么支持 DNS TTL(#24257 ),要么是类似 ConnectionLeaseTimeout 这样的 API(#26331 )。我们会结合 2.1 中的 HttpClientFactory 确保 DNS 变化的情况得到解决。

消息处理程序和自动重试

HttpClient 有一个鲜为人知的特性是能够添加消息处理程序。开箱即用,HttpClientHandler 控制着诸如是否允许自动重定向(Cookie 容器会用到)、预认证如何发挥作用这样的特性。

通过实现 DelegatingHandler 的子类可以进一步扩展。在 Channel 9 的一个示例中,Daniel Roth 展示了如何创建一个简单的重试处理程序。

HttpClientFactory 完善了这个特性,它允许开发人员将 HttpClientHandler 作为 HttpClient 配置的一部分。这是有意为 DI 提供便利。

SocketHttpHandler

HttpClientHandler 子系统不只是为了改变行为,它还可以完全改变 HttpClient 与网络通信的方式。微软正在通过引入 SocketHttpHandler 对此加以利用。这是一个“全新的托管 HttpClientHandler”,可以消除对“libcurl (对于 Linux)和 WinHTTP(对于 Windows)的平台依赖”。公告继续写到:

对于预览版 1,用户可以通过下面两种方式中的一种使用 SocketHTTPHandler:

环境变量:COMPlus_UseManagedHttpClientHandler=true
AppContext:System.Net.Http.UseManagedHttpClientHandler=true

用户也可以开启 ASP.NET 的套接字模式。随着当前原生实现的引入,这最终可能会成为默认设置。

查看英文原文 Fixing .NET’s HttpClient

2018-03-04 18:002824
用户头像

发布了 1008 篇内容, 共 450.3 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

笔记 | DevOps推动科技管理敏捷转型(文末附PPT)

嘉为蓝鲸

DevOps 运维 敏捷 IT 精益

盘点适合中小企业的文档管理工具

Baklib

优秀的产品手册有助于留住你的客户

Baklib

20个既简单又实用的JavaScript小技巧

千锋IT教育

MASA Framework 获取配置信息的方法

MASA技术团队

.net MASA Framewrok MASA

购买小间距LED显示屏前需要了解什么?

Dylan

LED显示屏 led显示屏厂家

聆心智能入选OPPO“微笑提案”TOP10,让有温度的AI技术守护数亿人心理健康

硬科技星球

干货|为什么说开源基金会的选择很关键?(下)

Orillusion

开源 WebGL 元宇宙 webgpu web3d

2022 云原生编程挑战赛启动!看导师如何拆解边缘容器赛题?

阿里巴巴中间件

阿里云 云原生编程挑战赛

建木持续集成平台v2.5.4发布

Jianmu

DevOps 持续集成 gitops 持续部署 Gitea

中国移动NZONE 50 Pro 5G手机正式开售

极客天地

为什么我要迁移SpringBoot到函数计算

Serverless Devs

AOSWAP去中心化交易所系统开发功能介绍

开发微hkkf5566

在数字时代,如何选择企业的知识管理软件

Baklib

SpringCloud 注册中心(Nacos)快速入门

nacos SpringCould 9月月更

搭建自己的以图搜图系统 (一):10 行代码搞定以图搜图

Zilliz

Python 机器学习 深度学习 相似度分析 以图搜图

当你的老板站在你背后,看你处理故障......

嘉为蓝鲸

运维 IT 故障 上班

「龙蜥开发者说」征稿啦!

OpenAnolis小助手

开源 征文 获奖 龙蜥开发者说 龙蜥技术

传统单节点网站的Serverless上云

Serverless Devs

堡垒机有录像吗?好用吗?有什么作用?

行云管家

网络安全 企业 数据安全 堡垒机 录像

万物皆可集成系列:低代码如何不成为数据孤岛

葡萄城技术团队

低代码 数据孤岛 集成

浅谈 SAP ABAP 系统里的 ALV 输出方式实现

汪子熙

前端开发 SAP abap 9月月更 ALV

中移链DDC-SDK技术对接全流程(一)

BSN研习社

UI自动化助力业务效率提升

转转技术团队

UI自动化测试

C#/VB.NET 设置Word文档段落缩进

在下毛毛雨

C# .net word文档 段落缩进

Apache Kyuubi 在小米大数据平台的应用实践

网易数帆

Java hive Apache Spark Thrift kerberos

数据可视化系列教程|六大组件基础知识

云智慧AIOps社区

大前端 低代码 开源项目 数据可视化 可视化大屏

高性能对象池实现

C++后台开发

后端开发 高性能服务器 内存池 对象池 C++开发

设计模式的艺术 第二十一章备忘录设计模式练习(设计一款RPG网游,为了给玩家提供更多方便,在游戏过程中可以设置一个恢复点,用于保存当前的游戏场景。如果在后续游戏过程中玩家角色“不幸牺牲”,可以返回到先前保存的场景,从所设恢复点开始重新游戏)

代廉洁

设计模式的艺术

使用FeatureAbility模块启动其他Ability

白晓明

OpenHarmony应用开发 FeatureAbility

修复.NET的HttpClient_.NET_Jonathan Allen_InfoQ精选文章