AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

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

关注

评论

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

在线XML转JSON工具

入门小站

工具

互联网的下一站,大概率是能源

脑极体

C++11 智能指针之shared_ptr<void>

轻口味

c++ android 4月月更

设置 Jupyter Notebook 主题

信号量

Python Jupyter Notebook notebook 主题 科学计算

crmeb Java 项目打包可运行jar文件详细教程

CRMEB

Substrate Builders Program | 了解波卡生态云计算平台与最先进的查询节点框架

One Block Community

区块链 Substrate 波卡

焱融看|AI 如何驱动存储发展

焱融科技

云计算 AI 分布式 高性能 文件存储

从分层架构到微服务架构(五)之服务化架构

元闰子

架构 从分层架构到微服务架构

[Day9]-[动态规划]编辑距离

方勇(gopher)

LeetCode 动态规划 数据结构算法

架构师作业2

小虾米

架构师实战营

Spring定义BeanDefinition

IT巅峰技术

对话核心开发者,波卡的EVM+最新技术分享活动回顾

One Block Community

区块链 Substrate EVM 波卡

云上MongoDB常见索引问题及最优索引规则大全

MongoDB中文社区

mongodb

Java 初始化 List 的几种方法

HoneyMoose

自己动手写Docker系列 -- 5.3实现logs命令查看容器日志

golang Docker

前端食堂技术周刊第 32 期:2022 年 3 月 TC39 会议、Rome Formatter、Node 内置 Test Runner

童欧巴

JavaScript 程序员 前端 web前端

怒肝 JavaScript 数据结构 — 栈篇(二)

杨成功

数据结构 4月月更

Redis集群架构剖析(5):复制与故障转移

非晓为骁

主从复制 redis cluster master

音视频&流媒体的原理以及基础入门知识

玩转音视频技术

Linux SRS 音视频开发 流媒体开发

C++后端开发进阶学习大纲指南

赖猫

c++

Java 在 IntelliJ IDEA 中提示 set the language level 9

HoneyMoose

Hoo虎符研究院|一图了解币圈后浪Magic Eden

区块链前沿News

虎符研究院

Go 实现 WebSockets:1.什么是 WebSockets

宇宙之一粟

Go 4月月更

Linux驱动开发-编写NEC红外线协议解码驱动

DS小龙哥

4月月更

MariaDB 的自增字段 AUTO_INCREMENT 字段

HoneyMoose

基于 HTML+CSS+JS 的纸牌记忆游戏

海拥(haiyong.site)

html 游戏 4月月更

关于数据湖几个问题详细剖析

五分钟学大数据

数据湖 4月月更

哈希值游戏DAPP开发|区块链哈希值竞猜游戏开发

薇電13242772558

区块链 哈希值

Tomcat:应用加载原理分析

IT巅峰技术

Tomccat

Go 学习笔记——Only For

为自己带盐

Go 4月月更

订单管理系统(OMS)搭建实战 - 低代码拖拽定制订单管理系统

蒋川

低代码 低代码开发 低代码平台 订单系统 订单管理系统

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