You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类库迁移至.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,步骤如下:

  1. 安装NuGet包:
    Install-Package Microsoft.Extensions.Http
    
  2. 手动配置服务并获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:23:25