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
相关产品推荐
相关产品推荐

