Заголовок запроса конечной точки Swagger .NET без привязки к параметру

#c# #.net-core #swagger

Вопрос:

Я ищу способ добавить заголовок a в конечную точку (не все конечные точки требуют этого), чтобы его можно было получить в моем промежуточном программном обеспечении до того, как запрос достигнет фактической конечной точки.

В настоящее время я использую аннотацию [FromHeader], но для этого требуется привязать ее к параметру. Это не то решение, которое мне нужно, так как мне не нужен заголовок в моем методе контроллера, а только в моем промежуточном программном обеспечении.

 public async Task<ApiResponse<Model>> GetModel([FromHeader(Name = "x-custom-header")] string customHeader)
 

Это линия, которую я пытаюсь преобразовать в более элегантное решение. Мне не разрешается указывать параметры в объявлении метода контроллера без их использования.

Комментарии:

1. Бирка чванства? Вы хотите, чтобы заголовок был явно указан в контракте swagger?

Ответ №1:

Этот атрибут указывает заголовок на действия контроллера :

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class AddHeaderParameterAttribute : Attribute
{
    public string Name { get; set; }
    public bool Required { get; set; }
}
 

Эта операция фильтрует действие проверки с помощью этого атрибута и изменяет контракт swagger :

 public class AddHeaderParameterFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var addHeaders = context.MethodInfo.GetCustomAttributes(typeof(AddHeaderParameterAttribute), true).Cast<AddHeaderParameterAttribute>();
        foreach(var header in addHeaders)
        {
            operation.Parameters.Add(new OpenApiParameter
            {
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema { Type = "string" },
                Name = header.Name,
                Required = header.Required
            });
        }
    }
}
 

Вы можете указать фильтр операций в Startup.ConfigureServices следующем :

 public void ConfigureServices(IServiceCollection services)
{
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { ... });
        c.OperationFilter<AddHeaderParameterFilter>();
    });
}
 

Затем вы можете украсить действие, как :

 [HttpGet]
[AddHeaderParameter( Name = "x-custom-header", Required = true)]
public IAction Get()
{ ... }