Blazor TypedClient调用AddHttpMessageHandler抛出InvalidOperationException问题
问题原因
这个异常是两个配置错误共同导致的循环依赖问题:
- 你额外添加了一段手动注册
HttpClient实例的代码,和AddHttpClient<T>自带的注册逻辑冲突,触发了Lazy实例的递归访问。 - 服务注册顺序错误,
BaseAddressAuthorizationMessageHandler依赖的认证相关服务是在AddOidcAuthentication方法中注册的,你将HttpClient的注册放到了认证服务注册之前,导致Handler依赖的服务无法被正常解析。
解决方案
按以下两步修改代码即可:
- 删掉多余的手动注册
HttpClient的代码:
// 完全删除这段代码 builder.Services.AddScoped(serviceProvider => { return serviceProvider.GetRequiredService<IHttpClientFactory>().CreateClient(nameof(ApplicationHttpClient)); });
AddHttpClient<ApplicationHttpClient>方法已经自动将Typed HttpClient作为作用域服务注册到容器中,你可以直接在组件、服务的构造函数中注入ApplicationHttpClient使用,无需手动从工厂创建再注册。
- 调整服务注册顺序,将认证服务的注册逻辑放到HttpClient注册逻辑之前。
修正后的完整代码
// Blazor WebAssembly 'Program.cs' public static async Task Main(string[] args) { var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); // 第一步:先注册OIDC认证服务 builder.Services.AddOidcAuthentication<RemoteAuthenticationState, RemoteUserAccount>(options => { builder.Configuration.Bind("Google", options.ProviderOptions); options.ProviderOptions.DefaultScopes.Add("email"); }).AddAccountClaimsPrincipalFactory<RemoteAuthenticationState, RemoteUserAccount, CustomAccountClaimsPrincipalFactory>(); // 第二步:再注册带授权Handler的Typed HttpClient builder.Services.AddHttpClient<ApplicationHttpClient>(nameof(ApplicationHttpClient), client => { client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress); }).AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>(); await builder.Build().RunAsync(); }
补充说明
你自定义的NoobHandler没有任何依赖项,所以不受注册顺序、额外注册逻辑的影响,能正常实例化运行。BaseAddressAuthorizationMessageHandler依赖IAccessTokenProvider等多个认证相关服务,错误的配置才会触发本次异常。
内容的提问来源于stack exchange,提问作者ibocon
相关产品推荐
相关产品推荐

