使用Swasbuckle在Web API中的不同控制器中添加单个自定义标头

Jho*_*n S 3 asp.net-web-api swagger-ui swagger-2.0 swashbuckle

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

控制器名称:Controller1,自定义标头:Header1

控制器名称:Controller2,自定义标头:Header2

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

jps*_*jps 7

这可以通过将一个OperationFilter添加到您的swagger配置中来解决。首先,您必须提供一个实现的类IOperationFilter。该Apply方法接收一个Operation参数,该参数在tag字段中包含控制器名称。呈现Swagger UI时,Apply将为API中的每个方法调用该方法。您甚至可以为每个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
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

在调试器中,使用名为的控制器ExampleController,如下所示:

调试输出

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

通过RegisterSwaggerConfig类的方法中添加一行来告诉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
                })

     } 
Run Code Online (Sandbox Code Playgroud)

此解决方案的想法基于ShaTin的答案:如何在Swagger UI中发送带有请求的自定义标头?