ASP.NET Core Web API POST请求遭CORS拦截,GET请求正常问题排查
问题场景
我基于C#开发了一个已配置CORS的ASP.NET Core Web API,前端使用React/JavaScript部署在另一台服务器,通过fetch调用API时出现如下问题:
- POST请求触发CORS错误
- GET请求可以正常获取数据,无CORS问题
POST请求代码
fetch('http://servername:8082/api/company/createedit', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }) .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));
CORS错误信息
Access to fetch at 'http://servername:8082/api/company/createedit' from origin 'http://localhost:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
正常的GET请求代码
fetch('http://servername:8082/api/company/getall') .then((response)=> response.json()) .then((data) => { setRequests(data.value); console.log(data); });
API的CORS配置(Program.cs)
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // CORS builder.Services.AddCors(options => { options.AddPolicy("AllowAnyOrigin", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // CORS app.UseCors("AllowAnyOrigin"); app.UseAuthorization(); app.MapControllers(); app.Run();
更新:问题根源与解决方法
经过排查,发现错误并非来自POST请求的正常JsonResult响应,而是控制器中未处理的异常导致返回了BadRequestObjectResult,这个结果没有携带Access-Control-Allow-Origin响应头,从而触发了CORS错误。
通过在控制器中处理异常,改用JsonResult替代BadRequestObjectResult返回后,响应头中正确包含了Access-Control-Allow-Origin,CORS问题解决。测试证实:Program.cs中配置的CORS规则,在控制器返回由异常生成的BadRequestObjectResult时不会生效。
内容的提问来源于stack exchange,提问作者bluveneziano

