.NET Core 6 Web API多接口并发调用CORS错误后端永久解决方法
.NET Core 6 Web API 并发调用CORS错误的永久解决方案
1. 检查CORS中间件顺序
CORS中间件必须放在**路由(UseRouting)和授权(UseAuthorization)**之前,否则会导致并发场景下部分请求的CORS规则不生效,尤其是预检请求。
正确的Program.cs配置顺序示例:
var builder = WebApplication.CreateBuilder(args); // 添加CORS服务 builder.Services.AddCors(options => { options.AddPolicy("AllowAllOrigins", policy => { policy.AllowAnyOrigin() // 生产环境建议替换为指定域名,如WithOrigins("https://your-frontend-domain.com") .AllowAnyMethod() .AllowAnyHeader() .WithPreflightMaxAge(TimeSpan.FromHours(1)); // 缓存预检请求结果,减少并发预检次数 }); }); // 添加其他服务(如Controllers、Swagger等) builder.Services.AddControllers(); var app = builder.Build(); // 必须在UseRouting和UseAuthorization之前调用UseCors app.UseCors("AllowAllOrigins"); app.UseRouting(); app.UseAuthorization(); app.MapControllers(); app.Run();
2. 确保预检请求(OPTIONS)被正确处理
并发调用时,浏览器会为非简单请求发送OPTIONS预检请求,若后端未正确响应,就会触发CORS错误。上述配置中WithPreflightMaxAge会缓存预检结果,避免重复发送;AllowAnyMethod/AllowAnyHeader确保所有预检请求都能通过。
如果API需要携带凭证(如Cookie、Header中的Token),必须添加.AllowCredentials(),同时前端请求要设置withCredentials: true:
options.AddPolicy("AllowCredentials", policy => { policy.WithOrigins("https://your-frontend-domain.com") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials() .WithPreflightMaxAge(TimeSpan.FromHours(1)); });
3. 验证全局策略覆盖所有接口
避免在控制器或Action上设置冲突的CORS规则,确保所有接口统一使用同一个全局策略。若需不同策略,需明确区分且无规则冲突。
4. 处理反向代理场景(如IIS/Nginx)
若API部署在反向代理之后,ASP.NET Core可能无法正确识别原始请求来源,导致CORS规则判定错误。需添加ForwardedHeaders中间件:
builder.Services.AddForwardedHeaders(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 允许的代理IP,根据实际环境配置 options.KnownProxies.Add(IPAddress.Parse("192.168.1.100")); }); // 在UseCors之前添加UseForwardedHeaders app.UseForwardedHeaders(); app.UseCors("AllowAllOrigins");
5. 排查并发连接限制(可选)
若以上配置均正确仍出现问题,可调整Kestrel的并发连接数:
builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxConcurrentConnections = 1000; // 根据实际需求调整 options.Limits.MaxConcurrentUpgradedConnections = 1000; });
验证方案
配置完成后,用浏览器开发者工具的Network标签,查看并发请求的OPTIONS和实际请求的响应头,确认包含Access-Control-Allow-Origin等CORS相关头,且OPTIONS请求状态码为200,实际请求状态码正常。
内容的提问来源于stack exchange,提问作者Abayomi Olowu
相关产品推荐
相关产品推荐

