You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:06:03