AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

SpringBoot整合Quartz

陈老老老板

定时任务 spring-boot 11月月更

MongoDB源码学习:Command的执行与注册

云里有只猫

mongodb 源码学习

BSN开放联盟链“武汉链”新版浏览器wuscan.io正式上线发布

BSN研习社

BSN 武汉链

从recat源码角度看setState流程

flyzz177

React

Springboot超详细入门

陈老老老板

spring-boot 11月月更

SpringBoot整合EasyExcel超详细教学

陈老老老板

spring-boot 11月月更

转化10亿GMV:螺丝钉也能变小马达

博文视点Broadview

看透react源码之感受react的进化

goClient1992

React

聊一聊装饰者模式

Java 设计模式

瓴羊Quick BI,强劲数据引擎助力企业数据分析

夏日星河

经营型项目经理是不是伪需求?

PMO实践

项目管理 敏捷 PMO 项目经理

链上挖矿分红智能合约DAPP系统开发部署模式定制

开发微hkkf5566

Web3领域首个三消小游戏Matching Game,近30日交易量破800万U

股市老人

JavaScript 基础

卢衍飞

JavaScript 学习 技术交流 基础

好好的系统,为什么要分库分表?

程序员小富

Java 数据库 面试 分库分表

React-Hooks源码深度解读

goClient1992

React

C++中的代码重用

Maybe_fl

从源码角度看React-Hydrate原理

flyzz177

React

Java 反射

卢衍飞

Java

Java 注解与反射 基础

卢衍飞

Java

深度分析React源码中的合成事件

goClient1992

React

ISV 的亚马逊云科技 marketplace ( 中国区) 之旅

亚马逊云科技 (Amazon Web Services)

亚马逊云科技 Tech 专栏 Marketplace

HDC2022的无障碍参会体验,手语服务是如何做到的?

HarmonyOS SDK

HMS Core

一个PMO从0-1建设的工作思路 | 对你绝对有用!

PMO实践

项目管理 PMO

从 Uber 数据泄露事件我们可以学到什么?

SEAL安全

数据安全 企业安全 PAM

Spring中获取bean的八种方式,你get了几种?

小小怪下士

Java spring bean

极客时间运维进阶训练营第五周作业

9527

Java 线程基础

卢衍飞

Java

横向对比主流BI软件优势,企业要按需选择

巷子

只需5步注册成为亚马逊云科技 Marketplace (海外区)专家

亚马逊云科技 (Amazon Web Services)

亚马逊云科技 Tech 专栏 Marketplace

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