fin*_*s10 2 c# swagger swashbuckle api-versioning asp.net-core-webapi
我正在使用Asp.Net Core 3.1来构建我的 API。我正在使用 swagger 为我的 API 生成文档。我决定根据控制器对我的 swagger 文档进行分组。所以我最终这样做了,
启动 - 配置服务:
options.SwaggerDoc(
"LibraryOpenAPISpecificationCategories",
...
Run Code Online (Sandbox Code Playgroud)
启动 - 配置:
options.SwaggerEndpoint(
"/swagger/LibraryOpenAPISpecificationCategories/swagger.json",
"Library API (Categories)");
Run Code Online (Sandbox Code Playgroud)
控制器:
[Route("api/categories")]
[ApiController]
[ApiExplorerSettings(GroupName = "LibraryOpenAPISpecificationCategories")]
public class CategoriesController : ControllerBase
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切正常。当我添加版本控制时,Swagger 文档停止显示控制器中的方法。我试图在版本中进行分组,以便每个版本都有这样的组,
V1 -> LibraryOpenAPISpecificationCategories
V1 -> LibraryOpenAPISpecificationItems
V2 -> LibraryOpenAPISpecificationCategories
V2 -> LibraryOpenAPISpecificationItems
这是我所做的,
启动 - 配置服务:
services.AddVersionedApiExplorer(options =>
{
options.GroupNameFormat = "'v'VV";
});
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.ReportApiVersions = true;
});
var apiVersionDescriptionProvider =
services.BuildServiceProvider().GetService<IApiVersionDescriptionProvider>();
services.AddSwaggerGen(options =>
{
foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions)
{
options.SwaggerDoc(
$"LibraryOpenAPISpecificationCategories{description.GroupName}",
...
Run Code Online (Sandbox Code Playgroud)
启动 - 配置:
app.UseSwaggerUI(options =>
{
foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions)
{
options.SwaggerEndpoint(
$"/swagger/LibraryOpenAPISpecificationCategories{description.GroupName}/swagger.json",
$"Library API (Categories) {description.GroupName.ToUpperInvariant()}");
Run Code Online (Sandbox Code Playgroud)
控制器:
[Route("api/categories")]
[ApiController]
[ApiExplorerSettings(GroupName = "LibraryOpenAPISpecificationCategories")]
public class CategoriesController : ControllerBase
Run Code Online (Sandbox Code Playgroud)
swagger 文档中没有显示错误。请帮助我解决我哪里出错了。我错过了什么吗?
经过一番分析后,我想通了,我错过了DocInclusionPredicate在AddSwaggerGen我的ConfigureServices。
这是我解决的方法,
options.DocInclusionPredicate((documentName, apiDescription) =>
{
var actionApiVersionModel = apiDescription.ActionDescriptor
.GetApiVersionModel(ApiVersionMapping.Explicit | ApiVersionMapping.Implicit);
var apiExplorerSettingsAttribute = (ApiExplorerSettingsAttribute)apiDescription.ActionDescriptor.EndpointMetadata.First(x => x.GetType().Equals(typeof(ApiExplorerSettingsAttribute)));
if (actionApiVersionModel == null)
{
return true;
}
if (actionApiVersionModel.DeclaredApiVersions.Any())
{
return actionApiVersionModel.DeclaredApiVersions.Any(v =>
$"{apiExplorerSettingsAttribute.GroupName}v{v.ToString()}" == documentName);
}
return actionApiVersionModel.ImplementedApiVersions.Any(v =>
$"{apiExplorerSettingsAttribute.GroupName}v{v.ToString()}" == documentName);
});
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助那里的人。
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |