Swagger: не удалось загрузить определение API - PullRequest
1 голос
/ 14 апреля 2019

У меня версионный API, когда я выбираю V1 на swagger, он работает нормально, когда я переключаюсь на вариант V2, я получаю это сообщение:

enter image description here

Вот мой Startup.cs

ConfigureServices:

services.AddApiVersioning(
            options =>
            {
                // reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions"
                options.ReportApiVersions = true;
            } );
        services.AddVersionedApiExplorer(
            options =>
            {
                // add the versioned api explorer, which also adds IApiVersionDescriptionProvider service
                // note: the specified format code will format the version as "'v'major[.minor][-status]"
                options.GroupNameFormat = "'v'VVV";

                // note: this option is only necessary when versioning by url segment. the SubstitutionFormat
                // can also be used to control the format of the API version in route templates
                options.SubstituteApiVersionInUrl = true;
            } );

Настройка:

app.UseSwagger();
        app.UseSwaggerUI(
            options =>
            {
                // build a swagger endpoint for each discovered API version
                foreach ( var description in provider.ApiVersionDescriptions )
                {
                    options.SwaggerEndpoint( $"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant() );
                }
                options.RoutePrefix = string.Empty;
            } );

Вот исходный код: https://github.com/felipexmitz/api-dotnet-core-basics

1 Ответ

1 голос
/ 16 апреля 2019

Для этого конкретного случая я решил:

в Configure:

    app.UseSwagger(options =>
    {
        options.RouteTemplate = "api/docs/{documentName}/swagger.json";
    });

    app.UseSwaggerUI
    (
        options =>
        {
            options.DocumentTitle = "...";
            options.RoutePrefix = "api/docs";

            foreach (var description in provider.ApiVersionDescriptions)
            {
                options.SwaggerEndpoint($"{description.GroupName}/swagger.json", "API " + description.GroupName.ToUpperInvariant() + " Specs");
            }
        }
    );

в ConfigureServices:

    services.AddVersionedApiExplorer(options =>
    {
        options.GroupNameFormat = "'v'VVV";
    });

    services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerApiVersioning>();

и сервис конфигурации, например:

    public class ConfigureSwaggerApiVersioning : IConfigureOptions<SwaggerGenOptions>
    {
        private readonly IApiVersionDescriptionProvider _provider;

        public ConfigureSwaggerApiVersioning(IApiVersionDescriptionProvider provider)
        {
            _provider = provider;
        }

        private static Info CreateInfoForApiVersion(ApiVersionDescription description)
        {
            return new Info()
            {
                //Title = "...",
                Version = description.ApiVersion.ToString(),
                //Description = "...",
                Contact = new Contact() { Name = "...", Email = "..." },
                //TermsOfService = "..."
                //License = new License() { Name = "...", Url = "..." }
            };
        }

        public void Configure(SwaggerGenOptions options)
        {
            foreach (var description in _provider.ApiVersionDescriptions)
            {
                options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description));
            }
        }
    }
...