c# - 在 asp.net core 3.1 web api 中,分组和版本控制不能很好地协同工作

标签 c# swagger asp.net-core-webapi swashbuckle api-versioning

我正在使用 Asp.Net Core 3.1 构建我的 API。我正在使用 swagger 为我的 API 生成文档。我决定根据 Controller 对我的 swagger 文档进行分组。所以我最终这样做了,

启动 - 配置服务:

options.SwaggerDoc(
    "LibraryOpenAPISpecificationCategories",
    ...

启动 - 配置:

options.SwaggerEndpoint(
    "/swagger/LibraryOpenAPISpecificationCategories/swagger.json",
    "Library API (Categories)");

Controller :

[Route("api/categories")]
[ApiController]
[ApiExplorerSettings(GroupName = "LibraryOpenAPISpecificationCategories")]
public class CategoriesController : ControllerBase

到目前为止一切正常。当我添加版本控制时,Swagger 文档停止显示 Controller 中的方法。我试图在版本中进行分组,这样每个版本都会有这样的组,

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}",
            ...

启动 - 配置:

app.UseSwaggerUI(options =>
{
    foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions)
    {
        options.SwaggerEndpoint(
            $"/swagger/LibraryOpenAPISpecificationCategories{description.GroupName}/swagger.json",
            $"Library API (Categories) {description.GroupName.ToUpperInvariant()}");

Controller :

[Route("api/categories")]
[ApiController]
[ApiExplorerSettings(GroupName = "LibraryOpenAPISpecificationCategories")]
public class CategoriesController : ControllerBase

swagger文档中没有显示错误。请帮我弄清楚我哪里出错了。我错过了什么吗?

最佳答案

经过一些分析,我发现我在 ConfigureServicesAddSwaggerGen 中遗漏了 DocInclusionPredicate

我是这样解决的

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);
});

希望这对外面的人有帮助。

关于c# - 在 asp.net core 3.1 web api 中,分组和版本控制不能很好地协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60475009/

相关文章:

c# - 使用 async/await 的技巧

c# - "Copy Local = false"引用的项目显示 "Could not load file or assembly"

c# - .net 核心中的 Unity 框架

c# - 如何在 Xamarin forms Android 中设置 PageTiltle FontFamily 和 Size

Azure kubernetes - 在 Azure API 管理中注册服务?

asp.net-core - .NET Core 2.1 上的 Swashbuckle/Swagger 自升级以来已停止工作

django - 使用 swagger-codegen 和用户名和密码进行基本身份验证

unit-testing - 如何在VS 2017 .net core项目中生成单元测试用例?

asp.net-core-mvc - 从 MVC Controller 在同一应用程序中使用 Web API

c# - dotnet new 的多项目模板