Swagger:在Swagger UI中更改API路由

7

我在AKS上部署了两个Kubernetes服务,它们从Nginx Ingress控制器接收流量。这两个服务的端点是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/的存在。我发现了许多类似于这个问题的相关问题,例如如何更改ASP.NET core中Swagger的基本URL。但它们不是我的问题的解决方案。我猜我需要为Swagger设置一个基本路径。如果有人能告诉我如何在ASP.NET core 2.0中配置Swagger的基本路径,我将不胜感激。

你解决了吗?我也遇到同样的问题,但没有成功。 - ecramer
很抱歉,不行。在Ingress后面使用swagger时,这应该是一个常见的问题,但我找不到任何提到它的帖子或文章。 - workharder
请查看此帖子:https://dev59.com/Y1cO5IYBdhLWcg3wt0D1。虽然不一定是最美观的解决方案,但对我们很有效。 - ecramer
@ecramer 确实对我也有效,非常感谢您让我知道。 - workharder
5个回答

15

改为:

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");
});

针对 .NET Core 3.x:(Swashbuckle 5.x 预发行版+)

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”与您的Helm Chart的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:
...


1
请在此之后使用以下内容:

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:<dns>/service1/api/v1/controller


感谢您的回复。实际上,“RoutePrefix”选项用于更改Swagger端点。在我的情况下,如果未设置它,则可以通过https:<dns>/service1/swagger访问Swagger UI,如果我设置了选项c.RoutePrefix =“service1”,那么我可以通过https:<dns>/service1/service1访问Swagger UI。 - workharder
它不起作用。更改Swagger访问名称不是我想要的。 - workharder
当您说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}")]或使用中间件将路径添加到基本路由中。 - ArlanG
谢谢!你的.NET Core 3示例在.NET 6、Swashbuckle 6.5和OpenApi 3中都可以工作,但我删除了c.RouteTemplate这一行,因为现在它与默认值相同。 - undefined
好的,请将示例作为此问题的更新提供!谢谢! - undefined


0

在您的入口中不要使用此注释

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


0
我正在使用ASP.NET Core 6与Swashbuckle.AspNetCore 6.5,并且需要对UNOPARATOR进行一些更改使其正常工作。
        app.UseSwagger(c =>
        {
#if !DEBUG

            c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.Servers = new List<OpenApiServer>
            {
                // {httpReq.Scheme} is http on deployed version, so hardcoding https
                new OpenApiServer { Url = $"https://{httpReq.Host.Value}/serviceName" }
            });
#endif
        });
        app.UseSwaggerUI();

我不明白的是为什么在部署时httpReq.Scheme返回http,而我在所有地方都使用https,所以我可以安全地硬编码(虽然我对此不太满意)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接