使用Swasbuckle

时间:2017-06-12 06:43:49

标签: asp.net-web-api swagger-ui swagger-2.0 swashbuckle

如何在不同的控制器上添加单个标头。 E.g:

控制器名称:Controller1, 自定义标题:标题1

控制器名称:Controller2, 自定义标题:标题2

应显示特定控制器下所有api的标题

1 个答案:

答案 0 :(得分:7)

这可以通过在您的swagger配置中添加OperationFilter来解决。 首先,您必须提供一个实现IOperationFilter的类。 Apply方法接收Operation参数,该参数包含tag字段中的控制器名称。呈现Swagger UI时,将为API中的每个方法调用Apply方法。您甚至可以为每个API方法提供单独的参数,因为Operation还包含operationId。

public class AddRequiredHeaderParameter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters == null)
            operation.parameters = new List<Parameter>();

        if (operation.tags[0]?.CompareTo("Example") == 0)
        {
            operation.parameters.Add(new Parameter
            {
                name = "X-ExampleParam",
                @in = "header",
                @default = "42",  // optional default value, can be omitted
                type = "string",
                description = "My special parameter for the example API",
                required = true
            });
        }
        else if (operation.tags[0]?.CompareTo("Whatever") == 0)
        {
        // add other header parameters here
        }
    }
} 

在调试器中,使用名为ExampleController的控制器,它看起来像这样:

debug output

Swagger UI中的结果是一个特殊参数,仅适用于我的示例控制器的API: swagger ui showing special parameter

通过在Register类的SwaggerConfig方法中添加一行来告诉Swagger使用您的OperationFilter:

public class SwaggerConfig
{
    public static void Register(HttpConfiguration config)
    {
        var thisAssembly = typeof(SwaggerConfig).Assembly;

        //GlobalConfiguration.Configuration
        config
            .EnableSwagger(c =>
                {
                ... // omitted some lines here
                c.OperationFilter<AddRequiredHeaderParameter>(); // Add this line
                ... // omitted some lines here
                })

     } 

这个解决方案的想法是基于ShaTin的回答:How to send custom headers with requests in Swagger UI?