asp.net-core - 在 Swagger 中自动生成对 SwaggerDoc 的调用

标签 asp.net-core swagger

    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/

相关文章:

redirect - mvc6 未经授权会导致重定向

c# - 在其他服务中访问 MVC DI 服务

api - Swagger 集成到 Dropwizard 中

visual-studio-2017 - 为什么 Visual Studio 2017 无法为 Swagger Petstore 生成 REST API 客户端?

c# - 创建引用 ActionFilters、HTTPContext、HTTPException 等的 .Net Standard 库

c# - 在 MVC 6 中将 View 渲染为字符串

swagger - Springfox 全局响应头

swagger - 如何在 Swagger 中定义空数组

json - 使用 Swagger/OpenAPI 扩展 JSON 元数据

c# - 无法绑定(bind)字符串索引查询字符串参数