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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:12:40