Docker容器中运行的ASP.NET API仅拦截POST和PUT请求
问题分析与解决方案
核心原因
PUT、POST请求会触发预检OPTIONS请求,而GET、DELETE属于简单请求无需预检。你的CORS配置或中间件部署存在关键缺失,导致预检请求被拦截。
解决方案
1. 补充CORS策略的请求头允许规则
PUT/POST通常携带Content-Type等自定义头,需在策略中明确允许这些头通过预检:
builder.Services.AddCors(options => { options.AddPolicy(name: rardkAllowOrigins, policy => { policy.WithOrigins("http://localhost:4200") .AllowAnyMethod() .AllowAnyHeader(); // 添加此行,允许所有请求头 }); });
2. 修正CORS中间件的部署位置
UseCors必须放在路由初始化之后、授权中间件之前,否则无法拦截预检请求:
app.UseRouting(); // 关键:CORS中间件位置不能错,要在路由之后、授权之前 app.UseCors(rardkAllowOrigins); app.UseAuthorization(); app.MapControllers();
3. 排查HTTPS混合内容问题
你的容器映射了443端口,若API强制HTTPS但前端用HTTP(localhost:4200),会触发浏览器的混合内容拦截:
- 临时注释
app.UseHttpsRedirection();测试是否解决问题 - 若需保留HTTPS,需将前端也切换为HTTPS,或调整CORS策略支持跨协议请求
4. 显式在控制器启用CORS(可选)
若全局中间件未生效,可在目标控制器或Action上添加特性强制启用:
[EnableCors("rardkAllowOrigins")] [ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { // 控制器逻辑 }
内容的提问来源于stack exchange,提问作者muttley91
相关产品推荐
相关产品推荐

