为什么.NET 6环境下SwaggerForOcelot无法加载服务的Swagger端点
解决方案
1. 下游服务自定义Swagger访问路径
要把AuthenticationAPI的Swagger路径修改为/auth/swagger这类自定义路径,直接在SwaggerUI配置中添加RoutePrefix参数即可:
app.UseSwagger(); app.UseSwaggerUI(setup => { // 自定义Swagger访问前缀,最终访问路径为 服务地址/auth/swagger setup.RoutePrefix = "auth/swagger"; setup.SwaggerEndpoint("/swagger/v1/swagger.json", "Authentication API v1"); });
2. Ocelot网关配置SwaggerEndPoints的正确方案
你之前遇到子配置不生效、CORS报错的核心原因是两个:一是没有用SwaggerForOcelot提供的配置加载扩展,二是直接写死下游服务的完整访问地址,导致网关前端页面直接跨域请求下游服务。
2.1 配置文件调整
把所有Ocelot相关配置文件统一放在Configuration文件夹下,单独新增ocelot.SwaggerEndPoints.json存放Swagger端点配置,内容示例如下:
{ "SwaggerEndPoints": [ { "Key": "Authentication", "Config": [ { "Name": "Authentication API v1", "Version": "v1", // 不要写完整的带域名端口的地址,走网关路由转发即可避免CORS问题 "Url": "/auth/swagger/v1/swagger.json" } ] } ] }
注意所有ocelot.*.json文件的「复制到输出目录」属性要设置为「如果较新则复制」,否则运行时会读取不到配置。
2.2 网关初始化代码调整
使用AddOcelotWithSwaggerSupport扩展方法加载配置,会自动合并所有子配置文件的内容,包括SwaggerEndPoints配置,不需要手动在代码中硬编码端点:
using MMLib.SwaggerForOcelot.DependencyInjection; using Ocelot.DependencyInjection; using Ocelot.Middleware; WebApplicationBuilder builder = WebApplication.CreateBuilder(args); // 指定配置文件夹,自动加载所有ocelot开头的配置文件 builder.Configuration.AddOcelotWithSwaggerSupport(options => { options.Folder = "Configuration"; }); builder.Services.AddOcelot(builder.Configuration); builder.Services.AddSwaggerForOcelot(builder.Configuration); builder.Services.AddMvc(); WebApplication app = builder.Build(); app.UseSwaggerForOcelotUI(options => { options.PathToSwaggerGenerator = "/swagger/docs"; }).UseOcelot().Wait(); app.Run();
补充说明
如果本地调试需要直接访问下游服务的Swagger,也可以在下游服务临时添加CORS配置允许网关地址访问,生产环境建议统一走网关入口访问所有服务的Swagger,不需要单独暴露下游服务的Swagger端口。
内容的提问来源于stack exchange,提问作者FullStackProgramming
相关产品推荐
相关产品推荐

