ASP.NET Core API部署于Envoy Proxy后访问Swagger UI提示swagger.json不存在
问题原因
- Envoy的路由规则仅匹配了API接口的路径规则,没有覆盖
/swagger前缀路径和swagger.json文件的请求路径 - ASP.NET Core的Swagger配置未适配反向代理场景,Swagger UI默认请求的
swagger.json路径和Envoy转发规则不匹配 - Envoy配置的路径重写规则错误修改了swagger相关请求的路径,导致上游服务无法匹配到对应资源
具体解决步骤
1. 调整Envoy路由配置
在Envoy的路由配置段新增swagger相关路径的匹配规则,确保这类请求能正常转发到ASP.NET Core服务,参考配置如下:
routes: # 原有API接口转发规则 - match: prefix: "/api" route: cluster: aspnetcore-api # 新增swagger UI页面路径匹配 - match: prefix: "/swagger" route: cluster: aspnetcore-api # 新增swagger.json文件路径匹配 - match: path: "/swagger.json" route: cluster: aspnetcore-api
如果你的Envoy配置中对API路径设置了重写规则,不要给swagger相关路径应用同一条重写规则,保持路径原样转发即可。
2. 调整ASP.NET Core的Swagger配置
在服务的Program.cs(或Startup.cs)中修改Swagger配置,适配反向代理场景:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); }); app.UseSwagger(c => { // 自动适配反向代理的域名、协议,确保swagger.json内的接口地址正确 c.PreSerializeFilters.Add((swaggerDoc, httpReq) => { swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}" } }; }); }); app.UseSwaggerUI(c => { // 显式指定swagger.json的请求路径,和Envoy转发规则保持一致 c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API名称 V1"); });
如果你是通过Envoy的子路径暴露该API服务(比如通过http://网关地址/myservice/访问接口),还需要在Swagger中间件之前添加配置app.UsePathBase("/myservice")。
3. 验证效果
配置全部生效后,直接访问http://你的Envoy对外地址/swagger即可正常打开Swagger UI,无需直接访问上游服务端口。
内容的提问来源于stack exchange,提问作者Mohsin Alam
相关产品推荐
相关产品推荐

