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规则:
- 删除代码中
httpRequestMessage.SetBrowserRequestMode(BrowserRequestMode.NoCors);这一行,Blazor WebAssembly的HttpClient默认使用cors请求模式,支持自定义application/json这类非简单请求头。 - 在
http://localhost:8000对应的API服务中配置CORS策略,允许你的Blazor站点来源(本地调试时就是Blazor项目的运行地址,比如http://localhost:5000)跨域访问,同时开放Content-Type请求头、允许POST方法。 - 最佳实践: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
相关产品推荐
相关产品推荐

