首页 > 解决方案 > Swagger - 隐藏 api 版本参数

问题描述

是否可以隐藏“api-version”和“x-api-version”参数?

        services.AddApiVersioning(config =>
        {
            config.ReportApiVersions = true;
            config.DefaultApiVersion = new ApiVersion(1, 0);
            config.AssumeDefaultVersionWhenUnspecified = true;

            config.ApiVersionReader = ApiVersionReader.Combine(
             new QueryStringApiVersionReader(),
             new HeaderApiVersionReader()
             {
                 HeaderNames = { "x-api-version" }
             });
        });

        services.AddVersionedApiExplorer(
            options =>
            {
                // note: the specified format code will format the version as "'v'major[.minor][-status]"
                options.GroupNameFormat = "'v'VVV";

                options.DefaultApiVersionParameterDescription = "Do NOT modify api-version!";
            });

我已经检查了实现“RemoveVersionFromParameter”方法的how-to-set-up-swashbuckle-vs-microsoft-aspnetcore-mvc-versioning,但在这种情况下,Swagger 页面会丢失 api 版本并始终使用默认的 v1.0 . 如代码片段所示,我使用的是 QueryStringApiVersionReader 和 HeaderApiVersionReader,但我不想支持 url api 版本控制。

注意:API 确实有多个适用于所有版本的 swagger json 页面(例如 V1、V1.1、V2.0)

在此处输入图像描述

标签: c#.netapiswagger-uiswashbuckle

解决方案


您可以尝试操作过滤器。这类似于 Helder 的解决方案,但实现不必在文档级别,因此看起来更简单:

public void Configure(SwaggerGenOptions options)
{
    // Filter out `api-version` parameters globally
    options.OperationFilter<ApiVersionFilter>();
}

internal class ApiVersionFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var parametersToRemove = operation.Parameters.Where(x => x.Name == "api-version").ToList();
        foreach (var parameter in parametersToRemove)
            operation.Parameters.Remove(parameter);
    }
}

推荐阅读