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
相关产品推荐
相关产品推荐

