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

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}");
}

额外验证点

  1. 确认AddHttpClient<IProductService, HttpProductService>配置的BaseAddress与页面注入的HttpClient一致(页面能正常工作,说明该值无误)。
  2. 排查CustomAuthorizationMessageHandler是否篡改请求路径:可临时移除AddHttpMessageHandler<CustomAuthorizationMessageHandler>测试,排除消息处理器的影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:50:04