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

Blazor WASM中HttpClient.SendAsync返回空响应但Fiddler抓包显示返回正常

问题根因

你遇到的问题是BrowserRequestMode.NoCors配置导致的,这是浏览器的标准限制:当使用NoCors模式发起跨域请求时,浏览器会将响应标记为不透明类型,前端JS/WASM层完全无法读取响应内容、状态码等任何属性,所以你会得到空的response对象,Chrome也会提示无法加载响应数据。NoCors模式仅适用于不需要读取响应结果的场景(比如无回显的日志上报、像素埋点等),不适合你的业务场景。

修复步骤
  • 第一步:删除代码中request.SetBrowserRequestMode(BrowserRequestMode.NoCors);这行配置
  • 第二步:配置服务端CORS跨域规则,允许你的Blazor应用所在域名访问接口,需要配置的规则如下:
    • 允许你的Blazor站点域名作为合法Origin
    • 允许POST请求方法
    • 允许Content-Type请求头
    • 如果你需要携带Cookie等身份凭证,还要额外开启Credentials支持
  • 本地调试临时方案:如果不方便修改服务端配置,可以通过Blazor自带的反向代理实现同源访问,在Program.cs中添加接口转发规则,将同域名下的指定路径请求转发到目标服务端,完全规避跨域问题。
修改后参考代码
private async Task OnSendSMSClick()
{
    var request = new HttpRequestMessage(HttpMethod.Post, baseAddress);
    // 移除NoCors配置
    request.SetBrowserRequestCache(BrowserRequestCache.NoCache);
    HttpContent content = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("client_id", client_id),
            new KeyValuePair<string, string>("client_secret", client_secret)
        });
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
    request.Content = content;
    RequestOutput = request.ToString();

    HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead);
    // 新增响应状态校验
    if (response.IsSuccessStatusCode)
    {
        var responseContent = await response.Content.ReadAsStringAsync();
        ResponseOutput = $"请求成功,状态码:{response.StatusCode},响应内容:{responseContent}";
    }
    else
    {
        ResponseOutput = $"请求失败,状态码:{response.StatusCode}";
    }
}

内容的提问来源于stack exchange,提问作者Ozan Yasin Dogan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:42:01