C# API遭CORS策略拦截:PUT/DELETE请求失败求助
问题现象
React前端调用C#后端API时,GET、POST请求可正常执行,但PUT、DELETE请求触发CORS错误:
Access to XMLHttpRequest at 'http://myBackEndDomain.example.com/resourcePath' from origin 'http://localhost:3000' has been blocked by CORS policy: Method PUT is not allowed by Access-Control-Allow-Methods in preflight response。
当前C# API的CORS配置代码如下:
//Cors builder.Services.AddCors(options => { options.AddPolicy("_corsPolicy", policy => { policy.WithOrigins("http://localhost:3000") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); var app = builder.Build(); // Configure the HTTP request pipeline. app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCors("_corsPolicy"); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
补充信息:API在Postman中可正常调用,浏览器禁用CORS扩展后也能正常运行,问题锁定在服务端CORS配置环节。
可能的解决方案
1. 显式指定允许的HTTP方法
虽然配置中使用了AllowAnyMethod(),但部分场景下预请求(OPTIONS)的响应可能未正确包含PUT/DELETE方法。尝试替换为显式声明所有需要的方法:
policy.WithOrigins("http://localhost:3000") .AllowAnyHeader() .WithMethods("GET", "POST", "PUT", "DELETE") // 显式指定支持的方法 .AllowCredentials();
2. 确认CORS策略全局生效
如果未在控制器或Action上添加[EnableCors("_corsPolicy")]属性,全局的CORS策略可能未正确应用到对应的API端点。可以在控制器类上绑定该策略:
[ApiController] [Route("api/[controller]")] [EnableCors("_corsPolicy")] // 绑定指定CORS策略 public class YourController : ControllerBase { // 控制器业务逻辑 }
3. 检查HttpsRedirection的干扰
UseHttpsRedirection()会将HTTP请求重定向到HTTPS,而浏览器的CORS预请求(OPTIONS)不支持重定向,可能导致验证失败。可以临时注释该中间件测试,或确保前端请求的是后端的HTTPS地址:
// app.UseHttpsRedirection(); // 临时注释以排查问题
4. 验证预请求的响应头
使用浏览器开发者工具(F12)查看PUT/DELETE请求对应的OPTIONS预请求响应头,确认Access-Control-Allow-Methods字段是否包含PUT、DELETE。如果未包含,说明CORS策略未正确生效,需检查中间件顺序或策略配置是否有误。
5. 排查策略冲突
检查是否存在多个AddPolicy定义的CORS策略,或控制器/Action上是否存在[DisableCors]属性,这些都可能导致当前策略失效。
内容的提问来源于stack exchange,提问作者Martin Curzel

