Reputation: 31
How can I add individual headers on different controllers. E.g.:
Controller Name: Controller1, Custom header: Header1
Controller Name: Controller2, Custom header: Header2
The headers should be displayed for all the apis under the specific controller
Upvotes: 3
Views: 3999
Reputation: 1
This is not an answer but stackoverflow wont' let me just make a comment on the solution from jps. Just wanted to add this is what I needed for my using clauses in jps's answer to get this to work in regular .net:
using Swashbuckle.Application;
using Swashbuckle.Swagger;
using System.Collections.Generic;
using System.Web.Http.Description;
Upvotes: -2
Reputation: 22585
This can be solved by adding an OperationFilter to your swagger configuration.
First you have to provide a class that implements IOperationFilter
. The Apply
method receives an Operation
parameter which contains the controller name in the tag
field. When the Swagger UI is rendered, the Apply
method will be called for each method in the API. You could even provide individual parameters for each API method, as Operation
also contains the 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
}
}
}
In the debugger, with a controller named ExampleController
, it looks like this:
The result in the Swagger UI is a special parameter that is only applied to the API of my Example controller:
Tell Swagger to use your OperationFilter by adding one line in the Register
method of the SwaggerConfig
class:
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
})
}
The idea to this solution is based on ShaTin's answer: How to send custom headers with requests in Swagger UI?
Upvotes: 8