Swagger 从 ASP.Net core 设置参数属性

Dir*_*irk 2 c# swagger asp.net-core swagger-codegen swagger-3.0

我正在使用 Swagger 进行 OpenApi 3.0 的序列化。详细地说,我尝试使用以下格式序列化输入查询参数数组

?myArray=1,2,3,4
Run Code Online (Sandbox Code Playgroud)

我知道如何在 swagger 文档中实现这一点。只需设置parameter.explode=false即可

parameters:
  - name: myArray
    in: query
    explode: false
    ...
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在控制器类的 ASP.Net Core 3.1 中设置此参数属性,以正确生成我的 swagger 文档。我尝试了一些方法,例如实现基于IParameterFilter 的过滤器,但对我来说没有任何效果。

Dir*_*irk 7

幸运的是,我能够解决这个问题,因为我在 GitHub 上的Swashbuckle.AspNetCore中找到了讨论。

实现自定义参数过滤器是正确的方法。

public class QueryArrayParameterFilter : IParameterFilter
{
    public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
    {
        if (!parameter.In.HasValue || parameter.In.Value != ParameterLocation.Query) 
            return;

        if (parameter.Schema?.Type == "array" && parameter.Name.Equals("myArray"))
        {
            var value = null as IOpenApiExtension;                
            parameter.Extensions.TryGetValue("explode", out value);

            if (value == null)
                parameter.Extensions.Add("explode", new OpenApiBoolean(false));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该过滤器必须应用于 ASP.Net core Startup.cs 中的 swagger gen

services.AddSwaggerGen(c =>
{
    c.ParameterFilter<QueryArrayParameterFilter>();
}
Run Code Online (Sandbox Code Playgroud)