先定义一个 Attribute
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]public class HeaderAttribute : Attribute{ public string Name { get; set; } public string Type { get; set; } public object[] EnumValues { get; set; } public bool Required { get; set; } public object Default { get; set; }}
依照需求,把挂在 Action 上
public class ValuesController : ApiController{ [Header(Name = "Header1", Type = "string", EnumValues = new object[] {1, 2, 3}, Default = "2")] public IEnumerable<string> Get() { return new[] {"value1", "value2"}; }}
实作 IOperationFilter,用来把 Action 上面的 HeaderAttribute,放到Operation.parameters
public class HeaderFilter : IOperationFilter{ public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { var headers = apiDescription.ActionDescriptor.GetCustomAttributes<HeaderAttribute>(); if (!headers.Any()) { return; } if (operation.parameters == null) { operation.parameters = new List<Parameter>(); } foreach (var header in headers) { var parameter = new Parameter { name = header.Name, @in = "header", type = header.Type, @enum = header.EnumValues?.ToList(), required = header.Required, @default = header.Default }; operation.parameters.Add(parameter); } }}
在 SwaggerConfig.cs 里面套用
c.OperationFilter<HeaderFilter>();
参考来源:
https://github.com/domaindrivendev/Swashbuckle/issues/501