Как настроить Swashbucle, чтобы найти чванство. json при замене части пути запроса? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь обновить. net API до. net core 3.1. Для того, чтобы это работало, я также должен перейти на Swashbuckle.AspNetCore 5.0. Это работает из коробки в localhost, но при развертывании не может найти файл чванства. json файл.

Startup.cs

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {

        app.Use(async (context, next) =>
        {
            context.Request.Path = context.Request.Path.Value.Replace("/api-svc", "");
            await next.Invoke();
        });
        app.UseSwagger();

        app.UseSwaggerUI(s =>
        {
            s.SwaggerEndpoint("/swagger/v1/swagger.json", "api v1");
        });
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseDefaultFiles();
        app.UseMiddleware<CustomExceptionHandlerMiddleware>();
        app.UseResponseCompression();
        app.UseCors("AllowAll");
        app.UseRouting();
        app.UseAuthentication();
        app.UseMvc();
    }

Ошибка извлечения: не определено /swagger/v1/swagger.json

Сеть показывает, что пытается извлечь файл из этого URL: https://api.com/swagger/v1/swagger.json, который правильно выдает ошибку:

Балансировщик нагрузки не имеет соответствующего маршрута. Что-то не так с вашим запросом!.

URL должен был быть: https://api.com/api-svc/swagger/v1/swagger.json. Потому что, когда я набираю это вручную, он отвечает файлом json.

Поэтому я попытался установить базовый путь (https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1173);

        if (env.IsDevelopment())
        {
            app.UseSwagger();

            app.UseSwaggerUI(s =>
            {
                s.SwaggerEndpoint("/swagger/v1/swagger.json", "api v1");
            });
        }
        else
        {
            app.UseSwagger(c =>
            {
                c.PreSerializeFilters.Add((swaggerDoc, request) =>
                {
                    swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"{request.Scheme}://{request.Host.Value}{Configuration["VIRTUAL_PATH"]}" } };
                });
            });
            app.UseSwaggerUI(s =>
            {
                s.SwaggerEndpoint("/swagger/v1/swagger.json", "api");
            });
        }

Но та же ошибка сохраняется. Кто-нибудь может указать мне правильное направление?

[Обновить]

(https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1253) Использование относительных путей заставило все выглядеть правильно:

   app.UseSwagger();
   app.UseSwaggerUI(s => {
                s.SwaggerEndpoint("v1/swagger.json", "api v1");
            });

Проблема теперь в том, что фактический URL-адрес запроса API равен https://api.com/health, когда он должен быть https://api.com/api-svc/health

1 Ответ

1 голос
/ 30 января 2020

Хорошо, поэтому после многих испытаний я нашел ответ:

  if (env.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI(s =>
                {
                    s.SwaggerEndpoint("v1/swagger.json", "api v1");
                });
            }
            else
            {
                app.UseSwagger(c =>
                {
                    c.PreSerializeFilters.Add((swaggerDoc, request) =>
                    {
                        var path = Configuration["VIRTUAL_PATH"];
                        swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer { Url = $"https://{request.Host.Value}{path}" } };
                    });
                });
                app.UseSwaggerUI(s =>
                {
                    s.SwaggerEndpoint("v1/swagger.json", "api");
                });
            }
...