Swashbuckle SchemaFilter用于api操作参数

时间:2019-04-25 12:16:27

标签: c# asp.net-core enums swagger swashbuckle

我成功创建了WorkflowScript: 30: expecting anything but ''\n''; got it anyway @ line 30, column 102. target/serenity-summary.html") ^ 1 error ,以扩展{em> swagger.json 枚举属性定义,以实现here所述的代码生成目的。这是我当前的ISchemaFilter方法:

SchemaFilter.Apply

public void Apply(Schema schema, SchemaFilterContext context) { if (context.SystemType.IsEnum) { var names = Enum.GetNames(context.SystemType); var values = Enum.GetValues(context.SystemType); var desc = ""; foreach (var value in values) { var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType())); desc += $"{intValue}={value},"; } desc = desc.TrimEnd(','); schema.Extensions.Add("x-enumNames", names); schema.Extensions["description"] = desc; } } 可以在我的模型定义中正常工作,其中模型类具有具有枚举类型的成员。以下是输出示例:SchemaFilter-字段,它是枚举类型,请注意自定义resolution和修改后的x-enumNames字段:

description

问题在于resolution: { format: "int32", enum: [ 1, 2, 3, 4 ], type: "integer", x-enumNames: [ "Hour", "Day", "Month", "Year" ], description: "1=Hour,2=Day,3=Month,4=Year" } 不会扩展操作参数中的枚举类型。例如,以下api方法具有参数SchemaFilter

resolution

这将对swagger.json生成以下操作参数定义(注意缺少public async Task<ActionResult<ReturnType>> GetData(Models.ResolutionEnum resolution) ):

x-EnumNames

有什么方法可以扩展作为方法参数一部分的招摇枚举方案吗?

2 个答案:

答案 0 :(得分:1)

尝试使用IDocumentFilter,我已经使用它注入了x-stuff,这是一个示例:

public class InjectXStuff : IDocumentFilter
{
    public void Apply(SwaggerDocument s, DocumentFilterContext c)
    {
        PathItem path = s.Paths.Where(x => x.Key.Contains("Values")).First().Value;
        path.Post.Parameters.FirstOrDefault().Extensions.Add("x-stuff", "123456");
    }
}

问题在于您需要了解高级路径,不确定是否可以在代码中使用某种模式来识别那些枚举...

答案 1 :(得分:1)

感谢another answer在这个问题下,我发现Swashbuckle.AspNetCore.SwaggerGen命名空间中有多个扩展点。 IParameterFilter正是我想要的,我能够将x-enumNames注入到方法参数定义中。

以下是我制作的参数过滤器:

public class ModifyParametersFilter : IParameterFilter
{
    public void Apply(IParameter parameter, ParameterFilterContext context)
    {
        var type = context.ParameterInfo?.ParameterType;
        if (type == null)
            return;
        if (type.IsEnum)
        {
            var names = Enum.GetNames(type);
            var values = Enum.GetValues(type);
            var desc = "";

            foreach (var value in values)
            {
                var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
                desc += $"{intValue}={value},";
            }
            desc = desc.TrimEnd(',');
            if (!parameter.Extensions.ContainsKey("x-enumNames"))
                parameter.Extensions.Add("x-enumNames", names);
        }
    }
}

与其他过滤器一样,可以使用以下代码段在Startup.cs中激活它:

services.AddSwaggerGen(c =>
{
    ..
    c.ParameterFilter<ModifyParametersFilter>();
}