【问题标题】:Swagger: change api route in Swagger UISwagger:在 Swagger UI 中更改 api 路由
【发布时间】:2019-02-18 10:17:56
【问题描述】:

我在 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。

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

【问题讨论】:

  • 你有什么发现吗?遇到同样的问题,没有运气。
  • @ecramer 不幸的是,没有。这应该是在 Ingress 后面使用 swagger 时的常见问题,但我找不到任何帖子或文章提到它。
  • 查看这篇文章:*.com/questions/45327119/…。不一定是最漂亮的解决方案,但它对我们有用
  • @ecramer 确实它也适用于我,非常感谢你让我知道。

标签: swagger asp.net-core-2.0 azure-aks


【解决方案1】:

改变这个:

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

到这里:

对于 dotnet core 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:
...

【讨论】:

    【解决方案2】:

    在你的入口不要使用这个注解

    nginx.ingress.kubernetes.io/rewrite-target:/

    【讨论】:

      【解决方案3】:

      请输入您的public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {

      在此之后使用:

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

      这个选项

      c.RoutePrefix = "service1";
      

      这会给你https:&lt;dns&gt;/service1/api/v1/controller

      【讨论】:

      • 感谢您的回复。 “RoutePrefix”选项实际上用于更改 swagger 端点。在我的情况下,如果没有设置,swagger UI 可以通过https:&lt;dns&gt;/service1/swagger 访问,如果我设置选项c.RoutePrefix = "service1"; 然后我可以通过https:&lt;dns&gt;/service1/service1 访问swagger UI
      • 它没有。更改招摇访问名称不是我想要的
      • 当您的意思是 tha url 更改为 service1/service1 时,您的意思是当您访问 swagger.json 时?如果是这种情况,您需要将c.SwaggerEndpoint("/service1/swagger/v1/swagger.json", "Giftaway API V1"); 更改为c.SwaggerEndpoint("/swagger/v1/swagger.json", "Giftaway API V1");。您只需在c.RoutePrefix = "service1"; 上指定基本路由,该路由将适用于每个端点。如果您在服务 url 中需要它,则需要在控制器中将其添加到 Route("api/{Controller}")] 或使用 sa 中间件将路径添加到基本路由。
      【解决方案4】: