.NET 6.0中CORS配置无效,如何解决跨域请求阻塞问题?
运行.NET 6.0应用时,调用API出现CORS错误,以下是Program.cs的配置代码:
var MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; builder.Services.AddCors(options => { options.AddPolicy(MyAllowSpecificOrigins, policy => { policy.WithOrigins("https://localhost:3000", "https://example.com") .AllowAnyHeader() .AllowAnyMethod(); }); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "JWTAuthDemo v1")); } using (var scope = app.Services.CreateScope()) { var dataContext = scope.ServiceProvider.GetRequiredService<MySiteContext>(); dataContext.Database.Migrate(); } app.UseHttpsRedirection(); app.UseCors(MyAllowSpecificOrigins); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
报错信息:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://localhost:5184/api/Meal/tags. (Reason: CORS request did not succeed). Status code: (null).
可能的原因及解决办法
中间件顺序确认:你的
UseCors位置是正确的(在UseHttpsRedirection之后,UseAuthentication/UseAuthorization之前),但要确保没有自定义中间件在UseCors之前拦截了OPTIONS预检请求,这类请求是CORS验证的关键。源地址匹配问题:检查前端实际发起请求的源地址,是否和
WithOrigins中配置的完全一致——协议(http/https)、域名、端口都不能错。比如如果前端实际是http://localhost:3000但你配置的是https,就会匹配失败。HTTPS证书问题:报错中状态码为
null,大概率是浏览器不信任后端的HTTPS证书(比如localhost自签名证书),导致请求无法建立连接,进而触发CORS错误。解决办法是在浏览器中信任该证书,或者开发环境临时改用HTTP测试。预检请求处理问题:如果后端有全局拦截器或路由限制,可能阻止了OPTIONS请求的正常返回。可以直接在浏览器开发者工具中查看OPTIONS请求的返回情况,确认是否收到正确的CORS响应头。
临时测试策略:开发环境可以临时将CORS策略改为允许所有源,验证是否是源配置的问题:
options.AddPolicy(MyAllowSpecificOrigins, policy => { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); });如果修改后请求正常,再回到源地址匹配的排查,确认前端实际请求源是否符合配置。
内容的提问来源于stack exchange,提问作者aeouxynn

