ASP.NET Core 8 Web API仅POST请求出现CORS拦截问题求助
解决ASP.NET Core 8 Web API仅POST请求触发CORS拦截的问题
可能的原因及修复步骤
1. 修复CORS配置的冗余冲突
你的CORS配置中同时使用了WithOrigins("*")和AllowAnyOrigin(),这会导致配置冲突。保留其中一个即可,推荐使用AllowAnyOrigin()(如果不需要限制来源):
builder.Services.AddCors(o => o.AddPolicy("MyPolicy", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }));
2. 确保预检请求(OPTIONS)被正确处理
POST请求如果包含JSON请求体,浏览器会先发送OPTIONS预检请求。可以显式声明允许OPTIONS方法(虽然AllowAnyMethod()已包含,但显式声明更稳妥):
builder.Services.AddCors(o => o.AddPolicy("MyPolicy", builder => { builder.AllowAnyOrigin() .WithMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .AllowAnyHeader(); }));
3. 检查模型绑定是否失败
如果POST请求的JSON格式与UsrUser模型不匹配,会触发模型绑定错误,此时ASP.NET Core可能在返回错误响应时未添加CORS头。可以添加全局异常处理中间件,确保所有响应都包含CORS头:
在app.UseCors("MyPolicy")之后添加异常处理:
app.UseExceptionHandler(appError => { appError.Run(async context => { context.Response.StatusCode = StatusCodes.Status500InternalServerError; context.Response.ContentType = "application/json"; context.Response.Headers.Append("Access-Control-Allow-Origin", "*"); await context.Response.WriteAsync("{\"message\": \"服务器内部错误\"}"); }); });
同时在控制器中添加模型验证检查:
[HttpPost] public ApiResponse<string> Post([FromBody] UsrUser user) { if (!ModelState.IsValid) { return new ApiResponse<string> { Success = false, Message = "请求参数无效" }; } // 业务逻辑代码 }
4. 确认中间件顺序正确
确保UseCors中间件的位置在UseAuthentication、UseAuthorization和MapControllers之前,且在UseHttpsRedirection之后,你的当前顺序是正确的,再次确认如下结构:
app.UseHttpsRedirection(); app.UseCors("MyPolicy"); // 必须在认证、授权和路由之前 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();
5. 检查HTTPS重定向的影响
如果前端使用HTTP(http://localhost:4200)而后端强制HTTPS,重定向过程中可能丢失CORS头。可以在开发环境暂时禁用HTTPS重定向测试:
// if (app.Environment.IsDevelopment()) // { // app.UseSwagger(); // app.UseSwaggerUI(); // // 禁用HTTPS重定向测试 // } // else // { // app.UseHttpsRedirection(); // }
内容的提问来源于stack exchange,提问作者Mr. Developer
相关产品推荐
相关产品推荐

