写点什么

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

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

关注

评论

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

“程”风破浪的开发者|国产之光,鸿蒙系统

急需上岸的小谢

OpenHarmony “程”风破浪的开发者

Glibc---_IO_do_write函数逻辑分析

桑榆

源码刨析 10月月更 C++

从源码分析MGR的新主选举算法

乌龟哥哥

10月月更

Linux学习-权限的理解

可口也可樂

后端 Linux Kenel linux 文件权限控制 10月月更

Node.js入门

Studying_swz

Node 10月月更

成功建设私有云需要考虑这些关键点

阿泽🧸

私有云 10月月更

【Java深入学习】一个关于“锁”的程序-中

Geek_65222d

10月月更

牛客刷题系列之进阶版(组队竞赛,排序子序列,倒置字符串, 删除公共字符,修理牧场)

雪芙花

c c++ 10月月更

【web 开发基础】PHP 快速入门(6)-PHP 运算符之赋值运算符详解

迷彩

10月月更 web开发基础 PHP基础

Kafka消费者JoinGroupRequest流程解析

石臻臻的杂货铺

kafka Kafka实战 10月月更

一文带你入门微服务,通俗易懂

wljslmz

架构 微服务 10月月更 单体服务

网络入门(基础知识和网络整体的认识)

雪芙花

c c++ 10月月更

【微信小程序】带你进入小程序的世界

hacker707

微信小程序 10月月更

Linux学习-开发工具yum/vim/gcc/g++/gdb

可口也可樂

开发工具 Linux Kenel 10月月更

Mybatis学习

Studying_swz

10月月更

Spring IOC和AOP

Studying_swz

spring 10月月更

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

9527

Docker常用命令小记

程序员欣宸

Docker 容器化 10月月更

数据湖(七):Iceberg概念及回顾什么是数据湖

Lansonli

数据湖 10月月更

Photoshop软件应用项目(四)

张立梵

设计师 ps 10月月更

鸿蒙开发实例 | 分布式涂鸦

TiAmo

华为 华为云 云开发 10月月更

2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴

福大大架构师每日一题

算法 rust 福大大

使用 SAP Business Application Studio 创建 Fiori Elements 应用显示 OData 服务的数据

汪子熙

云原生 Cloud SAP 10月月更 btp

Ubuntu 设置中文语言环境

Yeats_Liao

ubuntu 后端 10月月更

0:数据库的产生-MySQL

Yeats_Liao

数据库 后端 10月月更

C++精通之路:设计模式(特殊类设计)

雪芙花

c c++ 10月月更

YARN工作流程

穿过生命散发芬芳

YARN 10月月更

DevOps|从特拉斯辞职风波到研发效能中的荒唐事

laofo

DevOps cicd 研发效能 持续交付 敏捷研发

Photoshop软件应用项目(五)

张立梵

设计师 ps 10月月更

HashMap源码分析(四)

知识浅谈

hashmap 10月月更

【kafka原理】消费者提交已消费的偏移量

石臻臻的杂货铺

kafka Kafka实战 10月月更

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