类库迁移至.NET Standard 2.0后创建HttpClient及设置特性的疑问
解决方案:.NET Standard 2.0 下非Web API项目的HttpClient创建与消息处理器配置
1. 非Web API项目使用HttpClientFactory的方法
.NET Standard 2.0项目无需依赖ASP.NET Core宿主,可通过引入Microsoft.Extensions.Http NuGet包手动构建服务容器来使用HttpClientFactory,步骤如下:
- 安装NuGet包:
Install-Package Microsoft.Extensions.Http - 手动配置服务并获取
IHttpClientFactory实例:using Microsoft.Extensions.DependencyInjection; using System.Net.Http; using System.Collections.Generic; public class HttpClientCreator { private readonly IHttpClientFactory _httpClientFactory; private readonly List<Func<DelegatingHandler>> _features = new List<Func<DelegatingHandler>>(); private readonly HttpMessageHandler _baseHandler = new HttpClientHandler(); public HttpClientCreator() { var services = new ServiceCollection(); // 注册自定义HttpClient,并配置消息处理器链 var clientBuilder = services.AddHttpClient("CustomClient") .ConfigurePrimaryHttpMessageHandler(() => _baseHandler); // 添加所有自定义DelegatingHandler foreach (var handlerFunc in _features) { clientBuilder.AddHttpMessageHandler(handlerFunc); } _httpClientFactory = services.BuildServiceProvider().GetRequiredService<IHttpClientFactory>(); } public HttpClient Create() { return _httpClientFactory.CreateClient("CustomClient"); } }
如果不想依赖服务容器,也可以手动构建HttpClient与处理器链,逻辑更贴近你原有代码:
using System.Net.Http; using System.Collections.Generic; using System.Linq; public class HttpClientCreator { private readonly List<Func<DelegatingHandler>> _features = new List<Func<DelegatingHandler>>(); private readonly HttpMessageHandler _baseHandler = new HttpClientHandler(); public HttpClient Create() { HttpMessageHandler currentHandler = _baseHandler; // 反转处理器列表,匹配原HttpClientFactory的链构建逻辑 foreach (var handlerFunc in _features.Reverse()) { var delegatingHandler = handlerFunc(); delegatingHandler.InnerHandler = currentHandler; currentHandler = delegatingHandler; } return new HttpClient(currentHandler); } }
2. 关于"设置特性"的说明
你原有代码中的features是Func<DelegatingHandler>列表,这些是HTTP消息处理器(用于拦截、修改请求/响应),并非传统意义上的C#特性(Attribute)。在.NET Standard 2.0中,配置这些处理器有两种方式:
- 使用HttpClientFactory时:通过
AddHttpMessageHandler扩展方法将处理器逐个添加到客户端的处理器链中。 - 手动创建HttpClient时:按上述代码将DelegatingHandler依次链式连接到基础
HttpMessageHandler,最终传入HttpClient构造函数。
注意事项
- 手动创建HttpClient时,避免频繁实例化对象,建议复用实例以防止套接字资源耗尽。
- 配置DelegatingHandler链时,确保每个实例的
InnerHandler正确关联,形成完整的请求处理流程。
内容的提问来源于stack exchange,提问作者Selmo Jack
相关产品推荐
相关产品推荐

