ASP.NET Core API部署后CORS报错排查与解决方案咨询
ASP.NET Core API CORS问题排查与解决
问题背景
- 基于ASP.NET Core开发的API,在
Program.cs中配置了指定来源的CORS策略,允许特定IP端口的请求,同时开放任意请求头和方法,并调用app.UseCors(origins)启用策略 - 前端通过原生JavaScript的
fetch方法发送POST请求,请求头设置Content-Type: application/json - 发布控制器逻辑修改后,前端开始收到
no Access-Control-Allow-Origin in the request header跨域错误 - 尝试在IIS 10的
web.config中添加CORS配置(允许所有来源),又出现新错误:has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
问题根源
1. 初始Access-Control-Allow-Origin缺失原因
- 中间件顺序错误:
app.UseCors的调用位置不符合ASP.NET Core中间件执行顺序规则,导致CORS策略未生效(必须放在UseRouting之后、UseAuthorization之前) - 配置覆盖:发布后的环境配置(如
appsettings.Production.json或环境变量)覆盖了允许的源列表,导致策略失效 - 模块冲突:IIS的其他模块(如URL重写)拦截了请求,导致ASP.NET Core的CORS响应头未被正确添加
2. web.config配置后Content-Type不允许原因
- 双CORS配置冲突:ASP.NET Core自身的CORS中间件和IIS的CORS模块同时生效,导致响应头混乱
- IIS CORS配置不完整:默认配置未显式允许
Content-Type请求头,而发送application/json的POST属于非简单请求,预检请求会验证该头是否被允许
解决方案
方案一:修复ASP.NET Core原生CORS配置(推荐)
1. 调整中间件顺序
确保UseCors的位置符合规范,完整的Program.cs示例:
var builder = WebApplication.CreateBuilder(args); // 配置CORS服务 var originsPolicy = "allowedOrigins"; builder.Services.AddCors(options => { options.AddPolicy(originsPolicy, policy => { policy.WithOrigins( "http://10.9.8.50:80", "http://10.9.8.50:81", "http://10.9.8.50:7087", "http://10.9.8.50:5000" ) .AllowAnyHeader() .AllowAnyMethod(); }); }); // 添加控制器服务 builder.Services.AddControllers(); var app = builder.Build(); // 中间件执行顺序:路由 → CORS → 授权 → 端点映射 app.UseRouting(); // 必须放在UseRouting之后,UseAuthorization之前 app.UseCors(originsPolicy); app.UseAuthorization(); app.MapControllers(); app.Run();
2. 移除web.config中的CORS配置
删除web.config内的<cors>节点,避免和ASP.NET Core的CORS策略冲突
3. 验证发布配置
检查生产环境的appsettings.json或环境变量,确认CORS允许的源列表未被错误覆盖
方案二:使用IIS CORS模块(若需依赖IIS配置)
1. 移除ASP.NET Core中的CORS代码
删除Program.cs内的AddCors和UseCors相关代码,避免双配置冲突
2. 完善web.config的CORS配置
显式配置允许的源、请求头和方法,示例:
<cors enabled="true" failUnlistedOrigins="false"> <add origin="http://10.9.8.50:80" allowed="true"> <allowHeaders> <add header="Content-Type" /> </allowHeaders> <allowMethods> <add method="POST" /> <add method="GET" /> <!-- 按需添加其他HTTP方法 --> </allowMethods> </add> <add origin="http://10.9.8.50:81" allowed="true"> <allowHeaders> <add header="Content-Type" /> </allowHeaders> <allowMethods> <add method="POST" /> <add method="GET" /> </allowMethods> </add> <!-- 依次添加其他需要允许的源 --> </cors>
注意:IIS CORS模块的
origin="*"无法与带凭证的请求兼容,且必须显式声明允许的请求头
额外排查点
- 检查控制器是否意外添加了
[DisableCors]特性,导致CORS策略被禁用 - 通过浏览器开发者工具的Network面板,查看OPTIONS预检请求的响应头,确认
Access-Control-Allow-Origin、Access-Control-Allow-Headers等字段是否正确返回 - 若使用方案二,确认IIS已安装CORS模块(可在IIS管理器的「模块」列表中查看)
内容的提问来源于stack exchange,提问作者Alaa
相关产品推荐
相关产品推荐

