【译】.NET 8 网络改进(一)

💡 原文中文,约12500字,阅读约需30分钟。
📝

内容提要

随着新的.NET版本发布,网络空间中的有趣变化成为传统。今年,我们介绍了HTTP空间的变化、新指标和HttpClientFactory API。

🔎

延伸解读

内置HTTP指标:优势与当前限制

NET 8 使用 System.Diagnostics.Metrics API 为 HttpClient 和 ASP.NET Core 添加了内置 HTTP 指标,这些指标支持直方图、多维标签和用户自定义标签,能更丰富地监控请求持续时间、连接数等。但需注意,目前仅 System.Net.Http 和 System.Net.NameResolution 组件使用了新指标,底层如 System.Net.Sockets 仍依赖 EventCounters。团队未来会继续用新 API 添加检测,但 EventCounter

扩展遥测:关联请求与连接信息

NET 8 扩展了基于 EventSource 的遥测事件,在 ConnectionEstablished、ConnectionClosed 和 RequestHeadersStart 事件中增加了连接 ID、方案、主机、端口和远程地址等信息。这使得开发者可以通过自定义 EventListener 将请求与具体连接关联,从而在诊断场景中查看处理 HTTP 请求的服务器的 IP 地址。文章提供了示例代码,展示如何利用 AsyncLocal 和 ConcurrentDictionary 实现这一关联。

HttpRequestError 枚举:更可靠的错误处理

以往区分 HttpClient 异常的根本原因需要解析异常消息,不够可靠。NET 8 引入了 HttpRequestError 枚举,并在 HttpRequestException 和 HttpIOException 中提供该属性,使开发者能以编程方式处理特定错误,如 NameResolutionError、ConnectionError、InvalidResponse 和 VersionNegotiationError。这简化了错误处理逻辑,提高了代码的健壮性和可维护性。

HttpClientFactory 默认配置与 HTTPS 代理支持

NET 8 为 HttpClientFactory 添加了 ConfigureHttpClientDefaults 方法,允许为所有客户端设置默认配置,如添加公共消息处理程序或配置主处理程序,简化了重复配置。同时,支持通过 HTTPS 代理发送请求,只需在 WebProxy 中使用 https 方案即可,这增强了代理连接的安全性。这些 API 在 Microsoft.Extensions.Http 包中提供,支持 .NET Standard 2.0,因此也适用于 .NET Framework 等项目。

❓

Q&A

.NET 8 在 HTTP 指标方面有哪些主要改进?

.NET 8 使用 System.Diagnostics.Metrics API 为 ASP.NET Core 和 HttpClient 添加了内置 HTTP 指标,这些指标与 OpenTelemetry 合作确保符合标准,并支持直方图、多维性和用户定义标签,从而提供更丰富的监控功能。

HttpClient 在 .NET 8 中如何处理错误?

.NET 8 引入了 HttpRequestError 枚举,使开发者能够以编程方式区分错误原因,例如 NameResolutionError、ConnectionError 等,从而更可靠地处理特定内部错误。

.NET 8 如何支持 HTTPS 代理?

.NET 8 支持通过 HTTPS 代理处理请求,只需在设置代理时使用 HTTPS 方案,例如 new WebProxy("https://proxy.address:12345"),这样与代理的连接是安全的。

HttpClientFactory 在 .NET 8 中有哪些新功能?

.NET 8 扩展了 HttpClientFactory 的配置方式,包括使用 ConfigureHttpClientDefaults 方法为所有客户端设置默认配置,支持自定义日志记录和简化的 SocketsHttpHandler 配置。

扩展遥测事件在 .NET 8 中增加了哪些信息?

.NET 8 扩展了基于 EventSource 的遥测事件,增加了连接 ID、方案、主机、端口和远程地址等信息,便于诊断 HTTP 请求与连接的关联。

System.Diagnostics.Metrics 相比 EventCounters 有哪些优势?

System.Diagnostics.Metrics 支持直方图、多维性和用户定义标签,提供强类型且性能更高的集合 API,允许多个同时侦听器访问未聚合的测量结果,从而带来更丰富、更有效的指标。

🏷️

标签

➡️

继续阅读