大摇大摆地为通用控制器添加文档和操作

时间:2018-12-13 13:14:03

标签: c# .net-core swagger api-versioning

我正在使用带插件的webapi。添加插件后,我想更新swagger文档。不使用版本时可以处理。所有方法都添加到了swagger文档中。

但是当api开启apiversion时,新版本swagger文档的生成失败。返回404。

我需要做任何事情来使版本工作并获取动态控制器功能...

 private string AddSwaggerVersionDocument(PluginMetadata metadata)
        {

            var version = metadata.Version.ToApiVersion();

            if (SwaggerElements.GeneratorOptions.SwaggerGeneratorOptions.SwaggerDocs.ContainsKey(version) == false)
            {
                SwaggerElements.GeneratorOptions.SwaggerDoc(version, new Info
                {

                    Title = "webapi API",
                    Version = $"{version}",
                    Description = "Web API demo",
                    TermsOfService = "None",
                    Contact = new Contact
                    {
                        Name = "Frans van Ek",
                        Email = string.Empty,
                        Url = "https://fransvanek.nl"
                    },
                    License = new License
                    {
                        Name = "Use under LICX",
                        Url = "https://fransvanek.nl"
                    }
                });

                 SwaggerElements.UIOptions.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"My API : {version}");
            }
            return version;
        } 

1 个答案:

答案 0 :(得分:0)

我现在看到了。您正在使用自己的版本控制机制,并按需生成Swagger文档。 Swashbuckle希望一切都可以预先定义。这是合理的,因为受支持的版本应在应用程序开始时确定。如果您的应用程序是完全动态的,那么您当前的解决方案将起作用,但是在调用之间可能有所不同。如果提前发现并加载了插件,则可以注册一个IConfigureOptions<SwaggerGenOptions>来使用您的插件信息配置Swashbuckle。像这样:

public class ConfigureSwaggerOptions : IConfigureOptions<SwaggerGenOptions>
{
    readonly IApiDescriptionGroupCollectionProvider provider;

    public ConfigureSwaggerOptions(
        IApiDescriptionGroupCollectionProvider  provider ) => this.provider = provider;

    public void Configure( SwaggerGenOptions options )
    {
        // TODO: configure swashbuckler with plug-in information
    }
}

然后使用以下命令将其注册到服务容器中:

services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();

我希望对您有帮助