ASP.NET WebAPI如何配置CORS解决本地跨域POST请求报错问题
问题根因
你遇到的问题是两个核心问题叠加导致的:
- 非简单跨域请求的预检OPTIONS请求未被服务端正确处理
- 请求媒体类型和服务端接收规则不匹配
具体原因说明
- 你现在发送的POST请求指定了
contentType: application/json,不属于浏览器定义的简单跨域请求范围,浏览器会先自动发送OPTIONS预检请求验证跨域权限。你手写的CORS中间件没有单独处理OPTIONS请求,ASP.NET默认会直接拦截这类非业务请求,不会返回你设置的CORS响应头,浏览器收不到合法的预检响应就会报CORS错误,甚至直接触发连接重置。而Insomnia这类接口调试工具不会发送CORS预检请求,所以调用正常。 - 之前出现415错误是因为默认
$.post的请求Content-Type是application/x-www-form-urlencoded,但你传的是序列化后的JSON字符串,服务端如果配置了接收[FromBody]JSON参数的话,就会识别不了请求媒体类型,返回415错误。
解决步骤
- 替换手写CORS中间件,使用ASP.NET官方CORS组件
首先删除你自己写的手动添加Access-Control-Allow-Origin的中间件,在服务注册逻辑中添加CORS配置(以.NET 6+的Program.cs为例):
// 服务注册区域添加 builder.Services.AddCors(options => { options.AddPolicy("LocalDevPolicy", policy => { // 生产环境建议替换成你的前端应用实际域名,不要用AllowAnyOrigin policy.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); // 中间件管道区域,放在UseRouting之后、UseAuthorization之前添加 app.UseCors("LocalDevPolicy");
- 确认接口参数配置
你的接口方法参数需要添加[FromBody]特性,指定从请求体读取JSON参数:
[HttpPost("radar/insertConfig")] public IActionResult InsertConfig([FromBody] 你的配置实体类 参数名) { // 业务逻辑实现 }
排查本地拦截规则
如果配置完官方CORS后问题依然存在,检查你无法关闭的VPN、杀毒软件的网络规则,是否拦截了本地44326端口的OPTIONS/POST请求,很多企业安全软件会拦截本地服务的跨域非GET请求,可以尝试将API和前端都切换为HTTPS协议,或者更换API端口测试。验证请求链路
打开浏览器开发者工具的「网络」标签,勾选「保留日志」后复现请求,查看OPTIONS预检请求的响应状态和头信息:如果预检请求返回204且携带正确的CORS头,说明CORS配置生效,问题出在后续逻辑;如果预检请求被取消或者没有返回CORS头,再回头检查服务端配置。
内容的提问来源于stack exchange,提问作者Jalkun
相关产品推荐
相关产品推荐

