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

预检请求成功后仍出现CORS错误的技术求助

问题

从前端(Angular)发送POST请求时,.NET后端对预检OPTIONS请求返回200状态码,但后续POST请求仍触发CORS错误,已尝试多种方法未解决。

后端CORS配置代码

builder.Services.AddCors(options =>
{
   options.AddDefaultPolicy(
      policy =>
      {
         policy.SetIsOriginAllowed(_ => true).AllowAnyHeader().AllowAnyMethod();
      });
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
   app.UseSwagger();
   app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseRouting();
app.Use((context, next) =>
{
   if (!context.Request.Headers.Any(k => k.Key.Contains("Origin")) || context.Request.Method != "OPTIONS")
   {
      return next.Invoke();
   }
   context.Response.StatusCode = 200;
   return context.Response.WriteAsync("handled");
});
app.UseAuthentication();
app.UseCors();
app.UseMvcWithDefaultRoute();
app.UseAuthorization();
app.MapControllers();
app.Run();

环境信息

  • 浏览器:Brave、Chrome(均复现问题)
  • .NET版本:net6.0

已尝试的解决方法

  • 开启所有源、请求头和方法的CORS权限
  • 显式启用特定源(不含末尾斜杠)
  • 在对应控制器上使用[EnableCors]特性
  • 使用SetIsOriginAllowed(_ => true)替代AllowAnyOrigin()
  • 重启服务器
  • 删除obj和bin目录后重新构建运行
  • 重启电脑
  • 在Brave中设置安全浏览为“无保护”
  • 调整中间件添加顺序
  • 移除UseHttpsRedirection()改用HTTP协议
  • 修改发送的负载格式

问题根源与解决方案

问题出在自定义的OPTIONS请求处理中间件:手动拦截OPTIONS请求返回200,但未添加浏览器验证CORS所需的响应头(如Access-Control-Allow-Origin、Access-Control-Allow-Headers等),导致预检请求状态码正常但授权信息缺失,后续POST请求被浏览器拦截。

修复步骤:

  1. 删除自定义OPTIONS拦截中间件
    移除这段手动处理OPTIONS请求的代码,.NET原生UseCors中间件会自动完成预检请求的正确处理:

    app.Use((context, next) =>
    {
       if (!context.Request.Headers.Any(k => k.Key.Contains("Origin")) || context.Request.Method != "OPTIONS")
       {
          return next.Invoke();
       }
       context.Response.StatusCode = 200;
       return context.Response.WriteAsync("handled");
    });
    
  2. 调整中间件顺序
    确保UseCors位于UseRouting之后,UseAuthentication、UseAuthorization、UseMvcWithDefaultRoute和MapControllers之前,正确顺序示例:

    app.UseRouting();
    app.UseCors();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseMvcWithDefaultRoute();
    app.MapControllers();
    
  3. 验证响应头
    重启后端后,检查OPTIONS请求的响应头,确认包含Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等必要字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:45:03