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

发布后IIS上ASP.NET Core Web API遭CORS策略拦截无法运行

解决ASP.NET Core API发布后CORS调用失败问题

直接梳理关键问题点并给出修正方案:

1. 移除Angular请求中错误的请求头

你在httpOptions里添加的Access-Control-Allow-Origin和Access-Control-Allow-Methods是服务器返回给客户端的响应头,不是客户端请求时该携带的头。添加这些不仅无效,还可能干扰预请求逻辑。直接删除这两个头:

// 修正后的请求头配置,仅保留业务必要项
let httpOptions = {
  headers: new HttpHeaders({
    'Content-Type': 'application/json'
  })
};

2. 让Angular请求走代理配置

你已配置代理,但请求直接使用完整API地址http://localhost:7173/login/login,等于绕开了代理。改用相对路径,让代理自动转发:

// 使用相对路径,代理会自动转发到目标API地址
this.http.post<string>('/login/login', this.user, httpOptions)
  .subscribe(results => { console.log(results); },
    error => console.log(error));

启动Angular项目时,确保通过ng serve --proxy-config proxy.conf.json(对应你的代理文件名)启动,或在angular.json的serve配置中指定proxyConfig路径,保证代理生效。

3. 修正ASP.NET Core的CORS配置顺序与策略

调整中间件顺序

app.UseCors必须放在正确的执行顺序上,确保在路由和授权中间件之前运行:

var builder = WebApplication.CreateBuilder(args);

var MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

builder.Services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins,
                      builder =>
                      {
                          // 注意:AllowAnyOrigin()与AllowCredentials()同时使用会触发浏览器限制,需指定明确源
                          builder.WithOrigins("http://localhost:44413")
                          .AllowAnyHeader()
                          .AllowAnyMethod()
                          .AllowCredentials();
                      });
});

// 其他服务注册(如AddControllers、AddDbContext等)
builder.Services.AddControllers();

var app = builder.Build();

// 严格遵循中间件顺序
app.UseHttpsRedirection();
// 若有静态文件中间件,放在CORS之前
// app.UseStaticFiles();
app.UseCors(MyAllowSpecificOrigins); // 必须在UseRouting和UseAuthorization之前
app.UseRouting();
app.UseAuthorization();
app.MapControllers();

app.Run();

解决通配符与凭证的冲突

当启用AllowCredentials()时,浏览器不允许服务器返回Access-Control-Allow-Origin: *,因此必须明确指定允许的源地址。若需支持多个源,可扩展为WithOrigins("http://localhost:44413", "https://你的生产域名.com")。

4. 验证发布后的API配置

发布后可通过curl或Postman发送OPTIONS预请求,检查响应头是否包含正确的CORS字段:

curl -X OPTIONS http://localhost:7173/login/login -H "Origin: http://localhost:44413" -H "Access-Control-Request-Method: POST"

若响应头中存在Access-Control-Allow-Origin、Access-Control-Allow-Methods等字段,说明服务器配置生效;若不存在,检查发布后的appsettings.json是否覆盖了CORS配置,或是否有其他中间件(如URL重写)拦截了请求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:27:05