.NET 8中CORS预检请求返回405问题求助
解决ASP.NET Core 6迁移至.NET 8后CORS预检405错误的方案
1. 检查CORS中间件顺序
.NET 8对中间件执行顺序的校验更严格,必须确保UseCors在路由和授权中间件之前执行,否则预检请求会被提前拦截。调整Configure方法中的顺序:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 优先配置异常处理等基础中间件 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // CORS必须在UseRouting和UseAuthorization之前 app.UseCors("YourCorsPolicy"); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
2. 确保CORS策略包含OPTIONS方法
预检请求使用OPTIONS方法,需要在CORS策略中明确允许该方法(或直接允许所有方法):
services.AddCors(options => { options.AddPolicy("YourCorsPolicy", policy => { policy.WithOrigins("https://your-angular-domain.com") // 替换为你的Angular域名 .AllowAnyHeader() .AllowAnyMethod() // 包含OPTIONS在内的所有方法 .AllowCredentials(); // 若需携带Cookie/认证信息则开启 }); });
3. 排查AKS与Azure Traffic Manager的配置
3.1 Ingress控制器配置
如果使用NGINX Ingress,需在Ingress资源中添加CORS相关注解,避免Ingress拦截OPTIONS请求:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: your-api-ingress annotations: nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PUT, DELETE, OPTIONS" nginx.ingress.kubernetes.io/cors-allow-origin: "https://your-angular-domain.com" nginx.ingress.kubernetes.io/cors-allow-credentials: "true" # 对应API的AllowCredentials设置 spec: rules: - host: your-api-hostname.com http: paths: - path: / pathType: Prefix backend: service: name: your-api-service port: number: 80
3.2 Traffic Manager与网络策略
- 确认Azure Traffic Manager没有阻止OPTIONS请求的转发规则,检查其端点监控设置是否仅允许特定方法,需确保OPTIONS被包含。
- 检查AKS中的网络策略,是否存在拒绝OPTIONS流量的规则,若有需添加允许策略。
4. 排查自定义中间件或安全组件
检查项目中是否存在自定义中间件、WAF组件或认证中间件,可能在CORS中间件之前拦截了OPTIONS请求并返回405。可临时注释非必要中间件,逐步排查定位问题。
内容的提问来源于stack exchange,提问作者KNDM
相关产品推荐
相关产品推荐

