一、微服务跨域核心逻辑前端请求 → 先到 Ocelot 网关 → 再转发给下游微服务浏览器的跨域校验只认网关返回的响应头不认下游服务最佳实践网关统一配置跨域下游微服务【一律不配置跨域】→ 避免跨域头重复、浏览器直接报错核心是浏览器在 “把关”。前端发跨域请求时浏览器会自动带上前端的源地址后端根据配置的白名单决定是否在响应头加 “允许访问” 标记最后浏览器检查这个标记如果匹配就放行数据给前端不匹配就拦截。所以整个跨域校验过程浏览器是 “执行者”后端配置是 “规则”两者配合完成安全校验。二、代码Ocelot 网关项目1. 第一步Program.cs 核心代码完整可复制csharp运行using Ocelot.DependencyInjection; using Ocelot.Middleware; var builder WebApplication.CreateBuilder(args); // 1. 加载 Ocelot 配置文件ocelot.json builder.Configuration.AddJsonFile(ocelot.json, optional: false, reloadOnChange: true); // 2. 注入 Ocelot 服务 builder.Services.AddOcelot(builder.Configuration); var app builder.Build(); // 3. 使用 Ocelot 中间件自动处理跨域路由转发 await app.UseOcelot(); app.Run();2. 第二步Ocelot.json 跨域配置核心json{ GlobalConfiguration: { BaseUrl: http://localhost:9000, // 你的网关访问地址 CorsOptions: { AllowedOrigins: [ http://localhost:8080, // 前端开发地址必须精准填写 https://www.你的生产域名.com // 生产环境前端域名 ], AllowedMethods: [ GET, POST, PUT, DELETE, OPTIONS // 必须加浏览器预检请求不加必报错 ], AllowedHeaders: [*], // 允许所有请求头Token、Authorization等 AllowCredentials: true, // 允许携带Cookie/Token登录必开 MaxAge: 3600 // 预检请求缓存1小时提升性能 } }, Routes: [ { UpstreamPathTemplate: /api/{service}/{everything}, // 前端请求地址 UpstreamHttpMethod: [ Get, Post, Put, Delete ], DownstreamPathTemplate: /api/{everything}, // 转发到下游服务地址 DownstreamScheme: http, DownstreamHostAndPorts: [ { Host: localhost, // 下游微服务地址 Port: 5001 // 下游微服务端口 } ] } ] }三、关键配置解释1. AllowedOrigins允许的前端域名必须精准填写协议http/https 域名 端口❌ 错误写法localhost:8080✅ 正确写法http://localhost:8080生产环境禁止用*只填真实前端域名保证安全2. AllowedMethods允许的请求方式必须包含OPTIONS浏览器跨域前会先发预检请求不包含直接报错3. AllowCredentials允许携带凭证登录、Token、Cookie 必开true开启后不能用*允许所有域名必须指定具体域名4. 下游微服务注意事项✅必须删除所有跨域代码AddCors/UseCors→ 网关已经加了跨域头下游再加会导致头重复浏览器直接拦截四、开发环境简易配置本地调试用如果只是本地快速调试Ocelot.json 可以这样写允许所有前端访问jsonCorsOptions: { AllowedOrigins: [*], AllowedMethods: [GET,POST,PUT,DELETE,OPTIONS], AllowedHeaders: [*], AllowCredentials: false, // 允许所有域名时必须关闭凭证 MaxAge: 3600 }⚠️ 警告生产环境绝对不能用这个配置存在严重安全风险五、跨域不生效99% 是这 3 个问题没加 OPTIONSAllowedMethods 漏写预检请求下游服务也配了跨域头重复浏览器报错域名写错AllowedOrigins 没加 http/https 或端口写错六、总结一句话记住微服务跨域只配网关不配下游Ocelot.json 配置跨域后网关自动给响应加允许头浏览器看到允许头 → 放行数据 → 前端正常调用接口
.NET Core + Ocelot 网关 跨域 (CORS) 配置
发布时间:2026/7/17 17:04:07
一、微服务跨域核心逻辑前端请求 → 先到 Ocelot 网关 → 再转发给下游微服务浏览器的跨域校验只认网关返回的响应头不认下游服务最佳实践网关统一配置跨域下游微服务【一律不配置跨域】→ 避免跨域头重复、浏览器直接报错核心是浏览器在 “把关”。前端发跨域请求时浏览器会自动带上前端的源地址后端根据配置的白名单决定是否在响应头加 “允许访问” 标记最后浏览器检查这个标记如果匹配就放行数据给前端不匹配就拦截。所以整个跨域校验过程浏览器是 “执行者”后端配置是 “规则”两者配合完成安全校验。二、代码Ocelot 网关项目1. 第一步Program.cs 核心代码完整可复制csharp运行using Ocelot.DependencyInjection; using Ocelot.Middleware; var builder WebApplication.CreateBuilder(args); // 1. 加载 Ocelot 配置文件ocelot.json builder.Configuration.AddJsonFile(ocelot.json, optional: false, reloadOnChange: true); // 2. 注入 Ocelot 服务 builder.Services.AddOcelot(builder.Configuration); var app builder.Build(); // 3. 使用 Ocelot 中间件自动处理跨域路由转发 await app.UseOcelot(); app.Run();2. 第二步Ocelot.json 跨域配置核心json{ GlobalConfiguration: { BaseUrl: http://localhost:9000, // 你的网关访问地址 CorsOptions: { AllowedOrigins: [ http://localhost:8080, // 前端开发地址必须精准填写 https://www.你的生产域名.com // 生产环境前端域名 ], AllowedMethods: [ GET, POST, PUT, DELETE, OPTIONS // 必须加浏览器预检请求不加必报错 ], AllowedHeaders: [*], // 允许所有请求头Token、Authorization等 AllowCredentials: true, // 允许携带Cookie/Token登录必开 MaxAge: 3600 // 预检请求缓存1小时提升性能 } }, Routes: [ { UpstreamPathTemplate: /api/{service}/{everything}, // 前端请求地址 UpstreamHttpMethod: [ Get, Post, Put, Delete ], DownstreamPathTemplate: /api/{everything}, // 转发到下游服务地址 DownstreamScheme: http, DownstreamHostAndPorts: [ { Host: localhost, // 下游微服务地址 Port: 5001 // 下游微服务端口 } ] } ] }三、关键配置解释1. AllowedOrigins允许的前端域名必须精准填写协议http/https 域名 端口❌ 错误写法localhost:8080✅ 正确写法http://localhost:8080生产环境禁止用*只填真实前端域名保证安全2. AllowedMethods允许的请求方式必须包含OPTIONS浏览器跨域前会先发预检请求不包含直接报错3. AllowCredentials允许携带凭证登录、Token、Cookie 必开true开启后不能用*允许所有域名必须指定具体域名4. 下游微服务注意事项✅必须删除所有跨域代码AddCors/UseCors→ 网关已经加了跨域头下游再加会导致头重复浏览器直接拦截四、开发环境简易配置本地调试用如果只是本地快速调试Ocelot.json 可以这样写允许所有前端访问jsonCorsOptions: { AllowedOrigins: [*], AllowedMethods: [GET,POST,PUT,DELETE,OPTIONS], AllowedHeaders: [*], AllowCredentials: false, // 允许所有域名时必须关闭凭证 MaxAge: 3600 }⚠️ 警告生产环境绝对不能用这个配置存在严重安全风险五、跨域不生效99% 是这 3 个问题没加 OPTIONSAllowedMethods 漏写预检请求下游服务也配了跨域头重复浏览器报错域名写错AllowedOrigins 没加 http/https 或端口写错六、总结一句话记住微服务跨域只配网关不配下游Ocelot.json 配置跨域后网关自动给响应加允许头浏览器看到允许头 → 放行数据 → 前端正常调用接口