Tengo dos servicios de kubernetes implementados en un AKS, reciben tráfico de un controlador de ingreso Nginx. Los puntos finales para estos dos servicios son https:<dns>/service1 y https:<dns>/service2. Ahora quiero configurar Swagger para cada servicio. A continuación se muestra cómo configuro Swagger UI para uno de los servicios.

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

Con esta configuración, puedo obtener acceso a swagger por https:<dns>/service1/swagger.

Ahora el problema es, en Swagger UI, cuando quiero probar la api haciendo clic en el botón "Probar" y luego en el botón Ejecutar, la url a la que Swagger UI accede es https:<dns>/api/v1/contoller en lugar de https:<dns>/service1/api/v1/contoller. Lo que significa que Swagger UI no es consciente de la existencia de la ruta /service1/. Encontré varias preguntas relacionadas como esta Cómo cambiar url base de Swagger en ASP.NET core. Pero no son la solución para mi problema. Supongo que necesito establecer una ruta base para Swagger. Si alguien pudiera decirme cómo configurar la ruta base para Swagger en ASP.NET core 2.0, sería muy apreciado.

2
workharder 13 sep. 2018 a las 19:12

4 respuestas

La mejor respuesta

Cambie esto:

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

A esto:

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

Para 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 es necesario para acceder a la interfaz de usuario swagger en la máquina local.

Nota: supongo que "/ service1" es el mismo valor que en su archivo values.yaml de su gráfico de timón. (ver abajo)

...
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
UNOPARATOR 15 abr. 2020 a las 07:29

Configure su public void Configure (aplicación IApplicationBuilder, IHostingEnvironment env, ILoggerFactory loggerFactory) {

Usar después de esto:

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

Esta opción

c.RoutePrefix = "service1";

Esto te dará https:<dns>/service1/api/v1/controller

0
ArlanG 1 oct. 2018 a las 16:13

En su ingreso no use esta anotación

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

0
Kapil Ghimire 10 nov. 2018 a las 02:40