10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

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

关注

评论

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

《我和我的家乡》观后感

圣迪

工厂模式

李子捌

28天写作 12月日更

Android简介【Android专题1】

坚果

android 28天写作 12月日更

第1周作业提交

cqyanbo

手把手带你玩转 Spring

4ye

Java spring 程序员 内容合集 签约计划第二季

[Pulsar] Broker 消息分发

Zike Yang

Apache Pulsar 12月日更

日常开发的一点实践记录(合集)

为自己带盐

内容合集 签约计划第二季

《网易公开课》也能被拿来练习python爬虫?离谱~

梦想橡皮擦

12月日更

3.《重学JAVA》—Hello World

杨鹏Geek

Java 25 周年 28天写作 12月日更

使用JDK自带的jmap和jhat监控处于运行状态的Java进程

汪子熙

Java jdk jmap 28天写作 12月日更

给弟弟的信第3封|你幸福吗?

大菠萝

28天写作

架构实战营 - 毕业设计

Alex.Wu

架构训练营|大作业

Frode

「架构实战营」

Android C++系列:Linux线程(一)概念

轻口味

c++ android 28天写作 12月日更

秒杀系统架构设计

guangbao

为什么愿意奉献?(4/28)

赵新龙

28天写作

前端开发: Vue封装复用思想的运用(其一)

三掌柜

28天写作 12月日更

在主流的linux发行版里安装redis

为自己带盐

redis 28天写作 签约计划第二季 12月日更

架构实战训练营|毕业总结

Frode

「架构实战营」

amazing

Nydia

电子屏幕 or 风月宝鉴

mtfelix

架构实战营-毕业设计

娜酱

如何设计微服务架构

天天向上

架构实战营

毕业总结

potti

【架构实战营】毕业总结与设计

聆息

git出现ssh: connect to host github.com port 22: Connection refused

ilinux

电商秒杀系统设计

potti

架构实战营毕业总结

娜酱

【Redis权威指南】「特性分析」Sentinel的特性分析典籍指南(1)

码界西柚

redis哨兵模式 redis哨兵 redis sentinel Redis 核心技术与实战 12月日更

使用ABAP编程实现对微软Office Word文档的操作

汪子熙

数据库 死锁 28天写作 abap 12月日更

Flutter 浅尝 Flare / Lottie / SVGA 多种动画模式

阿策小和尚

28天写作 内容合集 签约计划第二季 12月日更

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