public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); //this replaces these services.AddMvcCore().AddApiExplorer();
...
services.AddSwaggerGen(options =>
{
// make this automatic ???
options.SwaggerDoc("v1", new Info { Version = "v1", Title = "v1 API", Description = "v1 API Description" });
options.SwaggerDoc("v2", new Info { Version = "v2", Title = "v2 API", Description = "v2 API Description" });
...
options.DocInclusionPredicate((version, desc) =>
{
var versions = desc.CustomAttributes().OfType<ApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
var maps = desc.CustomAttributes().OfType<MapToApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
return versions.Any(v => $"v{v.ToString()}" == version) && (!maps.Any() || maps.Any(v => $"v{v.ToString()}" == version));
});
});
}
此代码按预期工作。但是可以自动调用 SwaggerDoc
以使代码更加通用吗?在 desc
参数的 DocInclusionPredicate
中,可以收集版本。
最佳答案
由于您正在使用 ApiVersionAttribute
,我假设您正在使用 Microsoft.AspNetCore.Mvc.Versioning
nuget 包。该包提供了名为 IApiVersionDescriptionProvider
的服务。该服务提供所有检测到的 API 版本的枚举。然后,您可以自动将它们添加为 swagger-doc。
services.AddSwaggerGen(options =>
{
// you can use the IApiVersionDescriptionProvider
var provider = services.BuildServiceProvider()
.GetRequiredService<IApiVersionDescriptionProvider>();
foreach (var description in provider.ApiVersionDescriptions)
{
var info = new Info
{
Title = $"My API {description.ApiVersion}",
Version = description.ApiVersion.ToString(),
Contact = new Contact
{
Email = "info@mydomain.com",
Name = "Foo Bar",
Url = "https://thecatapi.com/"
}
};
options.SwaggerDoc(description.GroupName, info);
}
// instead of manually adding your versions
//options.SwaggerDoc("v1", new Info { Version = "v1", Title = "v1 API", Description = "v1 API Description" });
//options.SwaggerDoc("v2", new Info { Version = "v2", Title = "v2 API", Description = "v2 API Description" });
options.DocInclusionPredicate((version, desc) =>
{
var versions = desc.CustomAttributes().OfType<ApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
var maps = desc.CustomAttributes().OfType<MapToApiVersionAttribute>().SelectMany(attr => attr.Versions).ToArray();
return versions.Any(v => $"v{v.ToString()}" == version) && (!maps.Any() || maps.Any(v => $"v{v.ToString()}" == version));
});
});
关于asp.net-core - 在 Swagger 中自动生成对 SwaggerDoc 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58749442/