首页 > 解决方案 > 在 Swagger UI 上默认为最新的 API 版本

问题描述

我已经在我的 API 中实现了Swashbuckle.AspNetCore.SwaggerUI (版本 6.1.4)。该 API 还配置Microsoft.AspNetCore.Mvc.Versioning(版本 5.0.0)。

这现在可以工作了,我可以在页面顶部设置 API 版本来解析各种暴露的端点。

我的问题是,我是否可以将 Swagger UI 配置为将 Swagger 页面右上角的版本下拉列表默认为最高 API 版本。目前显示如下:

Select a definition - V1.0 (default)
                      V1.1
                      V2.0

我希望用户界面默认,在这种情况下为最新发布的版本(V2.0)

这是我的代码:

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

        services.AddSwaggerGen(
            options =>
            {
                options.EnableAnnotations();
                var xmlCommentsPath = GetXmlCommentsFilePath();
                if (File.Exists(xmlCommentsPath))
                {
                    options.IncludeXmlComments(xmlCommentsPath);
                }

                options.AddSecurityDefinition(
                    "Bearer", new OpenApiSecurityScheme
                    {
                        Name = "Authorization",
                        Type = SecuritySchemeType.ApiKey,
                        Scheme = "Bearer",
                        BearerFormat = "JWT",
                        In = ParameterLocation.Header,
                        Description = "JWT Authorization header using the Bearer scheme."
                    });

                options.AddSecurityRequirement(
                    new OpenApiSecurityRequirement
                    {
                        {
                            new OpenApiSecurityScheme
                            {
                                Reference = new OpenApiReference
                                {
                                    Type = ReferenceType.SecurityScheme,
                                    Id = "Bearer"
                                }
                            },
                            Array.Empty<string>()
                        }
                    });
            });

public class SwaggerOptions : IConfigureOptions<SwaggerGenOptions>
{
    private readonly IApiVersionDescriptionProvider provider;


    /// <summary>
    /// Initializes a new instance of the <see cref="SwaggerOptions"/> class.
    /// </summary>
    /// <param name="provider">The <see cref="IApiVersionDescriptionProvider">provider</see> used to generate Swagger documents.</param>
    public SwaggerOptions(
        IApiVersionDescriptionProvider provider)
    {
        this.provider = provider;
    }


    /// <inheritdoc />
    public void Configure(
        SwaggerGenOptions options)
    {
        // add a swagger document for each discovered API version
        // note: you might choose to skip or document deprecated API versions differently
        foreach (var description in provider.ApiVersionDescriptions)
        {
            options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description));
        }
    }


    private static OpenApiInfo CreateInfoForApiVersion(
        ApiVersionDescription description)
    {
        var info = new OpenApiInfo
        {
            Title = "Demo API",
            Version = description.ApiVersion.ToString(),
            Description = "A sample application with Swagger, Swashbuckle, and API versioning.",
            Contact = new OpenApiContact {Name = "DemoApi"},
            License = new OpenApiLicense {Name = "MIT", Url = new Uri("https://opensource.org/licenses/MIT")}
        };

        if (description.IsDeprecated)
        {
            info.Description += " This API version has been deprecated.";
        }

        return info;
    }
}

public static class SwaggerConfigExtension
{
    public static IApplicationBuilder
        ConfigureSwaggerUi(
            this IApplicationBuilder app,
            IApiVersionDescriptionProvider apiVersionProvider)
    {
        return app.UseSwaggerUI(
            options =>
            {
                options.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.Full);
                foreach (var description in apiVersionProvider.ApiVersionDescriptions)
                {
                    options.SwaggerEndpoint(
                        $"/swagger/{description.GroupName}/swagger.json",
                        description.GroupName.ToUpperInvariant());
                }
            }
        );
    }
}

任何帮助/方向将不胜感激。

标签: asp.net-coreasp.net-web-apiswagger-uiswashbuckle.aspnetcore

解决方案


安装 nugetMicrosoft.AspNetCore.Mvc.Versioning.ApiExplorer

然后在Startup.cs

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider apiVersionDescriptionProvider)
    {
.....

    app.UseSwaggerUI(c =>
            {
                foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions.Reverse())
                {
                    // Create the Swagger endpoints for each version
                    c.SwaggerEndpoint($"/swagger/" +
                        $"LibraryOpenAPISpecification{description.GroupName}/swagger.json",
                        description.GroupName.ToUpperInvariant());
                }
                c.RoutePrefix = ""; // swagger UI at the root index.html
            });
....
}

看到这个答案:点击这里


推荐阅读