Как заставить Swashbuckle работать в Asp. net Core 3.1 при использовании VersionByNamespaceConvention? - PullRequest
0 голосов
/ 17 февраля 2020

Я использую VersionByNamespaceConvention. В Startup.cs в ConfigureServices я добавил:

        services.AddApiVersioning(options =>
        {
            options.Conventions.Add(new VersionByNamespaceConvention());
        });

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
            c.SwaggerDoc("v2", new OpenApiInfo { Title = "My API", Version = "v2" });
        });

и в Configure

        app.UseSwagger();

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
        // specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
            c.SwaggerEndpoint("/swagger/v2/swagger.json", "My API V2");
        });

В root проекта у меня есть папки v1 и v2 и под теми, которые у меня есть Папка контроллеров. Код контроллеров (v2 идентичен v1, за исключением пространства имен и возвращаемого значения).

namespace WebApitest.v1.Controllers
{
    [ApiController]
    [Route("v{version:apiVersion}/[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        [HttpGet]
        public string Get()
        {
            return "v1";
        }
    }
}

Сам API работает хорошо, но рендеринг Swagger не работает должным образом.

При открытии https://localhost: 44307 / swagger / index. html показывает раскрывающийся список в верхнем правом углу, показывая «My API V1» и «My API V2», но в середине на экране отображается

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

Это работает, если у меня есть только контроллеры в версии v1. Но затем он показывает номер версии, как на изображении ниже, хотя номер версии здесь уже выбран.

enter image description here

Решение

Я добавил пакет nuget Microsoft.AspNetCore. Mvc .Versioning.ApiExplorer v4.x и добавил следующий код в ConfigureServices, и теперь он работает как положено.

        services.AddVersionedApiExplorer(o =>
        {
            o.GroupNameFormat = "'v'VVV";
            o.SubstituteApiVersionInUrl = true;
        });

1 Ответ

1 голос
/ 19 февраля 2020

Вам необходимо использовать services.AddVersionedApiExplorer и установить options.SubstituteApiVersionInUrl=true, чтобы сообщить Swagger о необходимости замены версии в маршруте контроллера и настроить версию API:

services.AddVersionedApiExplorer(o =>
{
      o.GroupNameFormat = "'v'VVV";
      o.SubstituteApiVersionInUrl = true;
});

Результат: enter image description here

...