#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()
{ ... }