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

Blazor WASM依赖注入问题:HttpClient字段在方法调用时为Null

Blazor WASM HttpClient注入后字段为Null的排查问题

我正在创建一个使用B2C认证的.NET 6 Blazor WASM(核心托管)网站,但遇到了HttpClient相关问题。

在Program.cs中我进行了如下依赖注入配置:

builder.Services.AddHttpClient<IBbtDataService, BbtDataService>(client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

该Bbt服务需要注入到FetchBbtData页面的代码后置类中,代码如下:

[Authorize]
public partial class FetchBbtData
{
    [Inject]
    public IBbtDataService BbtDataService { get; set; }
    public IEnumerable<ClientOrg> ClientOrgs { get; set; }

    protected async override Task OnInitializedAsync()
    {
        ClientOrgs = (await BbtDataService.GetClientOrgList()).ToList();
    }
}

BbtDataService的代码如下:

public class BbtDataService : IBbtDataService
{
    private readonly HttpClient httpClient;

    public BbtDataService(HttpClient httpClient)
    {
        httpClient = httpClient;
    }

    public async Task<IEnumerable<ClientOrg>> GetClientOrgList()
    {
        return await httpClient.GetFromJsonAsync<IEnumerable<ClientOrg>>($"api/clients");
    }
}

我在BbtDataService的构造函数处设置断点,发现httpClient参数有效且包含正确的基础URL,但当执行到GetClientOrgList方法的断点时,私有只读字段httpClient却为Null——尽管它应该在构造函数中已被赋值。


问题原因与解决方法

问题出在BbtDataService的构造函数赋值逻辑上:

构造函数的参数名和类的私有字段名完全相同,直接写httpClient = httpClient;时,编译器会将其解析为参数自身的赋值,并没有给类的私有只读字段httpClient赋值,导致字段始终保持默认的null状态。

修复方案(二选一即可)

  1. 使用this关键字明确指定赋值给类的字段:
public class BbtDataService : IBbtDataService
{
    private readonly HttpClient httpClient;

    public BbtDataService(HttpClient httpClient)
    {
        this.httpClient = httpClient; // 用this指定类的字段
    }

    public async Task<IEnumerable<ClientOrg>> GetClientOrgList()
    {
        return await httpClient.GetFromJsonAsync<IEnumerable<ClientOrg>>($"api/clients");
    }
}
  1. 修改构造函数参数名,避免和字段名冲突:
public class BbtDataService : IBbtDataService
{
    private readonly HttpClient httpClient;

    public BbtDataService(HttpClient httpClientParam) // 修改参数名
    {
        httpClient = httpClientParam;
    }

    public async Task<IEnumerable<ClientOrg>> GetClientOrgList()
    {
        return await httpClient.GetFromJsonAsync<IEnumerable<ClientOrg>>($"api/clients");
    }
}

修复后,私有字段会被正确赋值,调用GetClientOrgList时HttpClient就不会为null了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:54:41