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

Blazor WebAssembly中HttpClient.SendAsync发送错误Content-Type问题

问题原因

该问题是浏览器跨域安全策略限制导致,和你StringContent的配置无关:

  • 你在代码中设置了BrowserRequestMode.NoCors,对应浏览器Fetch API的no-cors请求模式。该模式下浏览器仅允许发送CORS安全列表内的请求头,其中Content-Type仅支持application/x-www-form-urlencoded、multipart/form-data、text/plain三个值。
  • 你设置的application/json不在安全列表范围内,会被浏览器直接忽略,强制重置为text/plain;charset=UTF-8,属于浏览器层面的强制行为,C#侧的配置无法绕过这个限制。
  • 额外注意:no-cors模式下你无法读取接口返回的正常响应内容,拿到的响应会是不透明的opaque类型,本身就不适合常规前后端JSON接口调用场景。
修复方案

根据你的实际场景二选一即可:

方案1(常规接口调用推荐)

移除no-cors模式配置,同时给API端配置正确的CORS规则:

  1. 删除代码中httpRequestMessage.SetBrowserRequestMode(BrowserRequestMode.NoCors);这一行,Blazor WebAssembly的HttpClient默认使用cors请求模式,支持自定义application/json这类非简单请求头。
  2. 在http://localhost:8000对应的API服务中配置CORS策略,允许你的Blazor站点来源(本地调试时就是Blazor项目的运行地址,比如http://localhost:5000)跨域访问,同时开放Content-Type请求头、允许POST方法。
  3. 最佳实践:Blazor WebAssembly中不建议手动new HttpClient,优先使用依赖注入获取的IHttpClientFactory创建的HttpClient实例,方便统一配置基地址、默认请求头等参数。

调整后的可参考代码:

HttpClient httpClient = new HttpClient();
MyRequest request = new MyRequest(data);

var content = new StringContent(
    System.Text.Json.JsonSerializer.Serialize(request), 
    System.Text.Encoding.UTF8, 
    "application/json"
);

HttpRequestMessage httpRequestMessage = new HttpRequestMessage
{
    RequestUri = new Uri("http://localhost:8000/api/action"),
    Content = content,
    Method = HttpMethod.Post          
};
// 移除NoCors配置
await httpClient.SendAsync(httpRequestMessage);

方案2(必须使用no-cors模式的特殊场景)

如果你因特殊业务限制必须保留no-cors模式,就无法使用application/json作为Content-Type,只能将Content-Type设置为允许的text/plain,同时修改API端的逻辑:接收请求时将text/plain类型的请求体按照JSON格式解析。

注意:该方案下你依然无法读取接口的正常响应结果,仅能确认请求发出,不推荐常规场景使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:24:23