.NET 8 Blazor WebAssembly中HttpClient注入失败问题求助
Blazor WebAssembly HttpClient注入失败的解决方法
问题现象
在.NET 8 Blazor WebAssembly应用启动时触发错误:
InvalidOperationException: 无法为类型'SGC.Client.Layout.NavMenu'的属性'Http'提供值。没有注册类型为'System.Net.Http.HttpClient'的服务。
客户端Program.cs代码如下:
var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.Services.AddHttpClient(); builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); builder.Services.AddAuthorizationCore(); builder.Services.AddCascadingAuthenticationState(); builder.Services.AddSingleton<AuthenticationStateProvider, PersistentAuthenticationStateProvider>(); builder.Services.AddRadzenComponents(); builder.Services.AddScoped<DialogService>(); builder.Services.AddScoped<NotificationService>(); builder.Services.AddScoped<ContextMenuService>(); builder.Services.AddScoped<TooltipService>(); await builder.Build().RunAsync();
在任意页面注入HttpClient时同样触发该错误,示例页面代码:
@page "/example" @inject HttpClient Http <h3>Example Page</h3>
问题根源
代码中重复注册了HttpClient服务:builder.Services.AddHttpClient()是用于配置HttpClient工厂的方法,后续手动添加的Scoped HttpClient实例会导致注册冲突,使得DI容器无法正确解析默认的HttpClient类型。
解决方法
选择以下任意一种正确的注册方式,移除重复代码:
方式1:直接注册Scoped HttpClient实例(简单场景)
完全移除builder.Services.AddHttpClient();这一行,只保留手动注册的Scoped实例:
var builder = WebAssemblyHostBuilder.CreateDefault(args); // 移除重复注册的AddHttpClient() builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); // 其他服务注册代码保持不变 builder.Services.AddAuthorizationCore(); builder.Services.AddCascadingAuthenticationState(); builder.Services.AddSingleton<AuthenticationStateProvider, PersistentAuthenticationStateProvider>(); builder.Services.AddRadzenComponents(); builder.Services.AddScoped<DialogService>(); builder.Services.AddScoped<NotificationService>(); builder.Services.AddScoped<ContextMenuService>(); builder.Services.AddScoped<TooltipService>(); await builder.Build().RunAsync();
修改后即可直接使用@inject HttpClient Http完成注入。
方式2:使用HttpClient工厂注册命名客户端(推荐复杂场景)
保留AddHttpClient()并配置默认命名客户端,移除手动注册的Scoped实例:
var builder = WebAssemblyHostBuilder.CreateDefault(args); // 注册命名的默认HttpClient,配置BaseAddress builder.Services.AddHttpClient("Default", client => { client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress); }); // 其他服务注册代码保持不变 builder.Services.AddAuthorizationCore(); builder.Services.AddCascadingAuthenticationState(); builder.Services.AddSingleton<AuthenticationStateProvider, PersistentAuthenticationStateProvider>(); builder.Services.AddRadzenComponents(); builder.Services.AddScoped<DialogService>(); builder.Services.AddScoped<NotificationService>(); builder.Services.AddScoped<ContextMenuService>(); builder.Services.AddScoped<TooltipService>(); await builder.Build().RunAsync();
注入时通过IHttpClientFactory创建命名客户端:
@page "/example" @inject IHttpClientFactory HttpClientFactory <h3>Example Page</h3> @code { private HttpClient Http; protected override void OnInitialized() { Http = HttpClientFactory.CreateClient("Default"); } }
额外检查
确保所有需要注入HttpClient的组件(包括NavMenu)中,注入的属性类型是System.Net.Http.HttpClient,属性名称拼写正确(比如你使用的Http),没有类型或名称错误导致的解析失败。
内容的提问来源于stack exchange,提问作者NickoZero
相关产品推荐
相关产品推荐

