隐藏标题以防止在 Swagger Swashbuckle 中显示

问题描述 投票:0回答:1

由于我已经添加了通用授权,如何从每个 API 中删除单独的(授权标头),如下图链接所示?

swaggerHub_Link

swagger swashbuckle swashbuckle.aspnetcore
1个回答
1
投票

我明白了:

您可以简单地创建一个自定义属性和一个继承自 Swashbuckle.AspNetCore.SwaggerGen.IOperationFilter 的操作过滤器,以隐藏标头,使其不显示在 swagger.json 中

public class OpenApiHeaderIgnoreAttribute : System.Attribute
{
}

类名应以基类的名称结尾。

public class OpenApiHeaderIgnoreFilter : Swashbuckle.AspNetCore.SwaggerGen.IOperationFilter
{
    public void Apply(Microsoft.OpenApi.Models.OpenApiOperation operation, Swashbuckle.AspNetCore.SwaggerGen.OperationFilterContext context)
    {
        if (operation == null || context == null || context.ApiDescription?.ParameterDescriptions == null)
            return;

        var parametersToHide = context.ApiDescription.ParameterDescriptions
            .Where(parameterDescription => ParameterHasIgnoreAttribute(parameterDescription))
            .ToList();

        if (parametersToHide.Count == 0)
            return;

        foreach (var parameterToHide in parametersToHide)
        {
            var parameter = operation.Parameters.FirstOrDefault(parameter => string.Equals(parameter.Name, parameterToHide.Name, System.StringComparison.Ordinal));
            if (parameter != null)
                operation.Parameters.Remove(parameter);
        }
    }

    private static bool ParameterHasIgnoreAttribute(Microsoft.AspNetCore.Mvc.ApiExplorer.ApiParameterDescription parameterDescription)
    {
        if (parameterDescription.ModelMetadata is Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadata metadata)
        {
            return metadata.Attributes.ParameterAttributes.Any(attribute => attribute.GetType() == typeof(OpenApiHeaderIgnoreAttribute));
        }

        return false;
    }
}

并在启动类的configureServices方法中设置此过滤器类,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSwaggerGen(c =>
    {
        c.OperationFilter<OpenApiHeaderIgnoreFilter>();
    }
}

并更新控制器中的 API 方法,如下所示:

[EnableQuery]
[SwaggerOperation(Tags = new[] { "Odata" })]
public async Task<IActionResult> Get([OpenApiHeaderIgnore] [FromHeader(Name = ClaimNames.AccessToken)] string token)
{
// code
}
© www.soinside.com 2019 - 2024. All rights reserved.