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

ASP.NET Core 6与Angular 14发布环境下CORS跨域问题求助

解决ASP.NET Core 6 + Angular 14跨域预检请求失败问题

你遇到的问题是预检OPTIONS请求没有返回200 OK状态,导致浏览器拦截了实际的API请求。下面是具体的排查和解决步骤:

1. 调整中间件执行顺序(最常见原因)

ASP.NET Core的中间件执行顺序有严格要求,UseCors必须放在UseAuthorization、UseAuthentication之前,且在UseRouting之后。修改你的Program.cs代码,按以下顺序排列中间件:

var builder = WebApplication.CreateBuilder(args);
var MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

// 配置CORS策略
builder.Services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins,
                      builder =>
                      {
                          builder.WithOrigins("https://consultation.programmerbox.ir",
                                              "http://localhost:4200")
                                 .AllowAnyHeader()
                                 .AllowAnyMethod()
                                 .AllowCredentials(); // 前端需携带Cookie/Token时必须添加
                      });
});

// 添加控制器服务
builder.Services.AddControllers();

var app = builder.Build();

// 中间件顺序严格遵循以下排列
app.UseHttpsRedirection();
app.UseRouting();

// 必须在UseAuthorization之前调用UseCors
app.UseCors(MyAllowSpecificOrigins);

app.UseAuthorization();

app.MapControllers();

app.Run();

2. 排查预检请求的具体错误

打开浏览器开发者工具(F12)→ 切换到「Network」标签,勾选「Preserve Log」,触发前端API请求后:

  • 找到对应的OPTIONS请求,查看它的状态码(比如401、403、500)
  • 如果状态码是401,说明认证中间件拦截了OPTIONS请求(OPTIONS请求默认不带Token),可以添加以下代码跳过OPTIONS请求的认证检查:
// 放在UseRouting之后、UseCors之前
app.Use(async (context, next) =>
{
    if (context.Request.Method == "OPTIONS")
    {
        context.Response.StatusCode = StatusCodes.Status200OK;
        await context.Response.WriteAsync(string.Empty);
        return;
    }
    await next();
});

3. 前端配合配置(若需携带凭证)

如果你的API请求需要携带Cookie或Token,Angular的HttpClient请求要加上withCredentials: true:

// 示例:发送验证码的请求
this.http.post(
  'https://api.consultation.programmerbox.ir/api/account/sendVerificationCode',
  { /* 请求体内容 */ },
  { withCredentials: true }
).subscribe(...);

4. 服务器环境检查

  • 若部署在IIS上,需确保Web.config允许OPTIONS方法,在<system.webServer>节点下添加:
    <handlers>
      <remove name="OPTIONSVerbHandler" />
      <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" responseBufferLimit="4194304" />
    </handlers>
    
  • 检查服务器防火墙/安全组规则,确保允许OPTIONS请求通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:31:39