Blazor WebAssembly中HttpClient注入引发404错误的求助
问题解决:Blazor WASM ProductService调用API报404 NotFound
问题核心
页面直接注入HttpClient调用api/Product/GetProductCatalog能正常返回数据,但通过ProductService调用时却报404,核心原因是请求路径不匹配。
具体分析
- 页面中正常工作的请求路径:
api/Product/GetProductCatalog(对应Web API的ProductController的GetProductCatalog方法) ProductService中实际发送的请求路径:api/Product(仅到控制器级别,缺少动作方法名)
修复步骤
修改HttpProductService的GetProductCatalog方法,补全正确的请求路径:
public async Task<ProductCatalog> GetProductCatalog() { // 补全动作方法名,和页面中调用的路径保持一致 var response = await TheHttpClient.GetAsync($"{GetApiBaseUri()}/GetProductCatalog"); if (response.IsSuccessStatusCode) { return await response.Content.ReadFromJsonAsync<ProductCatalog>(); } // 建议抛出异常而非返回空对象,便于调试定位问题 throw new HttpRequestException($"请求失败,状态码:{response.StatusCode}"); } protected virtual string GetApiBaseUri() => "api/Product";
另一种更简洁的写法(利用已配置的BaseAddress):
public async Task<ProductCatalog> GetProductCatalog() { // BaseAddress已包含api/Product,直接调用动作方法名即可 var response = await TheHttpClient.GetAsync("GetProductCatalog"); if (response.IsSuccessStatusCode) { return await response.Content.ReadFromJsonAsync<ProductCatalog>(); } throw new HttpRequestException($"请求失败,状态码:{response.StatusCode}"); }
额外验证点
- 确认
AddHttpClient<IProductService, HttpProductService>配置的BaseAddress与页面注入的HttpClient一致(页面能正常工作,说明该值无误)。 - 排查
CustomAuthorizationMessageHandler是否篡改请求路径:可临时移除AddHttpMessageHandler<CustomAuthorizationMessageHandler>测试,排除消息处理器的影响。
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

