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
相关产品推荐
相关产品推荐

