如何解决.NET Core Web API配置CORS后仍报跨域错误的问题?
.NET Core Web API CORS跨域问题解决步骤
你遇到的跨域不生效问题是.NET Core开发中CORS配置的典型踩坑场景,按以下步骤逐一排查修复即可:
- 首先核对前端请求地址:你第一次报错里拦截的请求地址是
http://localhost:5000/api,但你说明API服务运行在5001端口,先把前端请求的基地址改成正确的http://localhost:5001,端口不匹配的情况下所有CORS配置都不会生效,初始的405状态码本身就代表请求地址/请求方法没有匹配到对应接口。 - 修正CORS中间件注册顺序:这是.NET Core CORS配置不生效的头号原因,你之前只在
Configure方法里写了app.UseCors(),既没有提前在服务容器里注册CORS策略,也没有放对中间件顺序。app.UseCors()必须放在app.UseRouting()之后,app.UseAuthorization()、app.MapControllers()这类端点中间件之前,顺序错误时配置完全不会生效,你遇到的205状态码就是请求未经过CORS策略处理就被其他中间件提前返回导致的。 - 补全CORS策略配置项:你之前的配置只加了
AllowAnyMethod(),如果前端带了自定义请求头(比如鉴权用的Authorization头、Content-Type: application/json头),或者请求携带Cookie/凭据,必须补充对应配置,否则依然会触发跨域拦截。
正确完整配置代码
1. 在ConfigureServices方法中提前注册CORS策略
public void ConfigureServices(IServiceCollection services) { // 注册CORS策略,放在AddControllers之前即可 services.AddCors(options => { options.AddPolicy("AllowLocal5004", policy => { policy.WithOrigins("http://localhost:5004", "https://localhost:5004") // 不要加末尾斜杠 .AllowAnyHeader() // 允许所有请求头,覆盖自定义鉴权头、Content-Type等 .AllowAnyMethod() // 允许GET/POST/PUT/DELETE/OPTIONS等所有请求方法 .AllowCredentials(); // 前端带Cookie/Authorization凭据时必须加这行 }); }); services.AddControllers(); }
2. 在Configure方法中按正确顺序引入CORS中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 异常处理、开发环境页面等中间件放在最前 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); // 注意顺序:CORS中间件必须在UseRouting之后,UseAuthorization、MapControllers之前 app.UseCors("AllowLocal5004"); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
补充排查点
- 如果你用的是.NET 6+ 顶级语句写法(无Startup.cs文件),逻辑完全一致:先调用
builder.Services.AddCors(...)注册策略,再在app.UseRouting()之后、app.UseAuthorization()之前调用app.UseCors("AllowLocal5004")即可。 - 改完配置后完全停止并重启API服务,不要依赖热重载,部分场景下热重载不会加载中间件顺序的变更。
- 重启后可以手动发一个OPTIONS预检请求到目标接口,检查响应头中是否存在
Access-Control-Allow-Origin: http://localhost:5004,存在该响应头说明CORS配置已经生效,再排查接口本身的路由、方法、权限逻辑即可。
内容的提问来源于stack exchange,提问作者BlackCat
相关产品推荐
相关产品推荐

