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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:33:10