【问题标题】:Hide parameter from Swagger (Swashbuckle)从 Swagger (Swashbuckle) 中隐藏参数
【发布时间】:2021-10-20 18:16:28
【问题描述】:

我有一个选择了“启用 OpenAPI 支持”的 C# .NET 5.0 ASP.NET Core Web API 应用程序。我想隐藏下面示例中的optional 参数,使其与招摇页面上显示的内容无关。我发现了很多关于隐藏属性或控制器的帖子,但这些解决方案似乎都不适用于给定代码中的参数:

[HttpGet]
[Route("search")]
[Authorize]
public async Task<IActionResult> Search(string query, string optional = "")
{
   return OK();
}

【问题讨论】:

    标签: c# swagger .net-5 swashbuckle


    【解决方案1】:

    您可以创建自定义属性和继承自 Swashbuckle.AspNetCore.SwaggerGen.IOperationFilter 的操作过滤器,以从 swagger.json 生成中排除所需的参数

    public class OpenApiParameterIgnoreAttribute : System.Attribute
    {
    }
    
    public class OpenApiParameterIgnoreFilter : 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(OpenApiParameterIgnoreAttribute));
            }
    
            return false;
        }
    }
    

    把它放在你的控制器的参数中

    [HttpGet]
    [Route("search")]
    [Authorize]
    public async Task<IActionResult> Search(string query, [OpenApiParameterIgnore] string optional = "")
    {
        return Ok();
    }
    

    然后在Status.cs中配置

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API Title", Version = "v1" });
            c.OperationFilter<OpenApiParameterIgnoreFilter>();
        });
    

    【讨论】:

    • 感谢您将“放入控制器的参数”部分!我不(仍然不)理解OpenApiParameterIgnore 在您提供的代码中的其他任何地方是如何被引用的。我猜它来自OpenApiParameterIgnoreAttribute 并且隐含了Attribute 部分?
    • 是的,属性后缀是编译器隐含的。按照命名约定,Microsoft 建议以基类的名称结束自定义类。 docs.microsoft.com/en-us/dotnet/standard/design-guidelines/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多