写点什么

修复.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:002296
用户头像

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

关注

评论

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

拒招中国程序员后,开源平台 GitLab 又开始大规模封杀开发者账户

Java架构师迁哥

关于linux操作系统中的buff/cache

程序员架构进阶

Linux cache buffer

那个小白还没搞懂内存溢出,只能用案例说给他听了

田维常

内存溢出

遥感影像处理有高招,“专治”各类花式并发的述求!

华为云开发者联盟

容器 k8s 遥感

多线程问的太深入不知道怎么回答,从volatile开始给你讲清楚

小Q

Java 学习 面试 volatile 多线程

“3+3”看华为云FusionInsight如何引领“数据新基建”持续发展

华为云开发者联盟

数据库 新基建 华为云

不要拿区块链做挡箭牌

CECBC

区块链

刷Github时发现了一本阿里大神的算法笔记!标星70.5K

Java架构师迁哥

从红黑树的本质出发,彻底理解红黑树!

996小迁

Java 架构 面试 程序人生

USDT币支付系统开发搭建,区块链承兑商支付平台

13530558032

SQL数据库:CASE表达式

正向成长

CASE表达式

报告显示国际区块链监管呈三大趋势

CECBC

区块链 货币 监管

MySQL全面瓦解—子查询和组合查询

比伯

Java 编程 程序员 架构 计算机

干货!直观地解释和可视化每个复杂的DataFrame操作

计算机与AI

Python pandas 数据处理

#不吐不快# IT职场里的奇葩经历

InfoQ写作社区官方

职场搞笑 奇葩的经历 热门活动

数字货币交易所功能,场外OTC交易所开发公司

13530558032

数字货币助力支付体系高效运行

CECBC

金融

程序员求助:腾讯面试题,64匹马8个跑道,多少轮选出最快的四匹

Java架构师迁哥

SQL数据库:子查询和关联子查询

正向成长

SQL子查询 SQL关联查询

【乘风破浪的开发者】丁一超:从AI实战营出发探索未知的AI世界

华为云开发者联盟

华为 AI modelarts

云算力挖矿模式系统开发,云算力平台搭建

13530558032

覆盖全网的阿里微服务架构有多牛:K8S+实战+笔记+项目教程

Java~~~

Java 程序员 微服务 Spring Cloud 阿里云 K8S

Alibaba首发的《Java技术成长笔记》,渴望提升自己的程序员的必备宝典!

Java架构之路

Java 程序员 架构 面试 编程语言

《精通lambda表达式:Java多核编程》.pdf

田维常

Lambda

React Fiber 是什么?

局外人

react.js 大前端 React

亿级大表分库分表实战总结(万字干货,实战复盘)

学习 编程 架构 计算机网络

牛批!2w字的Java集合框架面试题精华集(2020最新版),赶紧收藏。

Java架构之路

Java 程序员 架构 面试 编程语言

「Spring Boot 2.4 新特性」一键构建Docker镜像

AI乔治

Java Docker 架构

这套JVM核心知识你要全都会,月薪还不过18K可以直接跳槽了

小Q

Java 学习 架构 面试 JVM

anyRTC AI降噪|让声音更清晰

anyRTC开发者

人工智能 AI 音视频 WebRTC RTC

数字货币钱包开发费用,区块链钱包开发优势

13530558032

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