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

DelegatingHandler依赖注入问题:AuthorizationHandler注册异常

问题分析与解决方案

核心问题根源

你遇到的依赖注入异常,本质是容器隔离导致的:你在Autofac容器中注册了AuthorizationHandler,但创建IHttpClientFactory时是新建了一个独立的ServiceCollection并构建了自己的服务提供程序——这两个容器完全独立,后者根本访问不到Autofac中注册的任何服务,自然找不到AuthorizationHandler。

正确的整合方案

方案1:Autofac与原生DI整合(通用场景)

不要在Autofac中单独注册IHttpClientFactory,而是先通过原生ServiceCollection配置HttpClient和相关服务,再将其导入Autofac容器,实现服务互通:

// 1. 先配置原生DI的服务集合
var services = new ServiceCollection();

// 配置HttpClient并关联消息处理器
services.AddHttpClient("MyApi", client =>
{
    client.BaseAddress = new Uri("https://example.com/authenticate");
    client.DefaultRequestHeaders.TryAddWithoutValidation("x-api-key", "MY-API-KEY");
})
.AddHttpMessageHandler<AuthorizationHandler>();

// 注册业务服务到原生DI
services.AddScoped<IAuthenticationService, AuthenticationService>();
services.AddTransient<AuthorizationHandler>(); // 将处理器注册到原生DI,供HttpClientFactory访问

// 2. 将原生DI的注册项导入Autofac
var containerBuilder = new ContainerBuilder();
containerBuilder.Populate(services); // 关键:打通Autofac与原生DI的服务注册

// 此处可添加Autofac专属的注册逻辑(如果需要)
// containerBuilder.RegisterType<XXX>().As<IXXX>().InstancePerLifetimeScope();

// 3. 构建Autofac容器
var container = containerBuilder.Build();

// 4. 从Autofac容器解析IHttpClientFactory
var httpClientFactory = container.Resolve<IHttpClientFactory>();
var client = httpClientFactory.CreateClient("MyApi");

方案2:ASP.NET Core 集成场景(更简洁)

如果是ASP.NET Core项目,直接使用Autofac作为默认DI容器,无需手动处理容器隔离:

var builder = WebApplication.CreateBuilder(args);

// 指定Autofac作为服务提供工厂
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

// 配置HttpClient
builder.Services.AddHttpClient("MyApi", client =>
{
    client.BaseAddress = new Uri("https://example.com/authenticate");
    client.DefaultRequestHeaders.TryAddWithoutValidation("x-api-key", "MY-API-KEY");
})
.AddHttpMessageHandler<AuthorizationHandler>();

// 注册业务服务
builder.Services.AddScoped<IAuthenticationService, AuthenticationService>();
builder.Services.AddTransient<AuthorizationHandler>();

// 可选:添加Autofac专属注册逻辑
builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
    // containerBuilder.RegisterType<XXX>().As<IXXX>();
});

var app = builder.Build();

// 后续中间件配置...

额外修正点

你的AuthorizationHandler中存在一个认证头格式错误:AuthenticationHeaderValue的第一个参数是认证方案(如Bearer),而非请求头名称Authorization。修正后代码如下:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    request.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", await _service.GetAccessToken()); // 替换为正确的认证方案
    return await base.SendAsync(request, cancellationToken);
}

内容的提问来源于stack exchange,提问作者Griffin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:45:30