首页 > 解决方案 > Swagger:在 Swagger UI 中更改 api 路由

问题描述

我在 AKS 上部署了两个 kubernetes 服务,它们从 Nginx 入口控制器接收流量。这两个服务的端点是https:<dns>/service1https:<dns>/service2。现在我想为每个服务设置 Swagger。下面是我如何为其中一项服务设置 Swagger UI。

app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "API V1");
        });

使用此配置,我可以通过https:<dns>/service1/swagger.

现在的问题是,在 Swagger UI 中,当我想通过单击“试用”按钮然后执行按钮来测试 api 时,Swagger UI 访问的 url https:<dns>/api/v1/contoller不是https:<dns>/service1/api/v1/contoller. 这意味着 Swagger UI 不知道 path 的存在/service1/。我发现了几个相关问题,例如How to change base url of Swagger in ASP.NET core 。但它们不是我的问题的解决方案。我的猜测是我需要为 Swagger 设置一个基本路径。如果有人能告诉我如何在 ASP.NET core 2.0 中为 Swagger 配置基本路径,将不胜感激。

标签: swaggerasp.net-core-2.0azure-aks

解决方案


改变这个:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
  c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "API V1");
});

对此:

对于 dotnet 核心 2.x

app.UseSwagger(c =>
{
#if !DEBUG
  c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.BasePath = "/service1");
#endif
});
app.UseSwaggerUI(c =>
{
  c.SwaggerEndpoint("./swagger/v1/swagger.json", "API V1");
});

对于 dotnet core 3.x (Swashbuckle 5.x prerelease+)

app.UseSwagger(c =>
{
#if !DEBUG
  c.RouteTemplate = "swagger/{documentName}/swagger.json";
  c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.Servers = new System.Collections.Generic.List<OpenApiServer>
  {
    new OpenApiServer { Url = $"{httpReq.Scheme}://{httpReq.Host.Value}/service1" }
  });
#endif
});
app.UseSwaggerUI(c =>
{
  c.SwaggerEndpoint("./swagger/v1/swagger.json", "API V1");
});

#if !DEBUG ... #endif是在本地机器上调试时访问 swagger ui 所必需的。

注意:我假设“/service1”与舵图的 values.yaml 文件中的值相同。(见下文)

...
ingress:
  enabled: true
  annotations: {
    kubernetes.io/ingress.class: "nginx",
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  }
  path: /service1/?(.*)
  hosts:
    - your-aks-subdomain.your-azure-region.cloudapp.azure.com
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

hpa:
...


推荐阅读