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状态。
修复方案(二选一即可)
- 使用
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"); } }
- 修改构造函数参数名,避免和字段名冲突:
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
相关产品推荐
相关产品推荐

