asp.net-core - 在 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());
}
}
);
}
}
任何帮助/方向将不胜感激。
解决方案
安装 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
});
....
}
看到这个答案:点击这里
推荐阅读
- gml - gamemaker 2.0 中的碰撞失败
- prometheus - 为什么 Alertmanager 无法向 slack 发送警报
- javascript - 新用户输入后重新渲染页面
- excel - 将一个工作表中的一行附加到不同工作簿中的工作表
- ios - 如何将 curl Plaid 请求转换为 swift
- python - Keras NN 模型无法预测未来值
- php - 使用PHP从数组中提取字符串中特定字符的两次计数之间的文本
- android - 无法使用从 React Native App 生成的 .aar 文件运行 Android 应用程序
- mysql - MySQL的“SHOW ENGINE INNODB STATUS”输出中的“TRANSACTION ACTIVE .. sec”是什么意思?
- batch-file - 如何在批处理/cmd文件中使用Admin privs运行程序(没有runas,如果需要密码则不允许psexec)?