Добавление заголовков только к определенным вызовам в Swashbuckle

Я пытаюсь настроить Swagger для нашего API с помощью Swashbuckle. Каждый из наших контроллеров наследуется от BaseController, который имеет около 8 параметров (userId, язык, платформа и т. д.). У каждого из них есть переменные только для чтения, а их функция get настроена на чтение значения из извлеченных заголовков. Пример:

protected int UserID
    {
        get
        {
            return int.Parse(HttpContext.Current.Request.Headers["user_Id"]);
        }
    }

Когда я впервые установил Swagger, он давал только варианты для передачи параметров, перечисленных в методе. Эти параметры всегда исключают ~8 параметров, установленных в BaseController, поэтому, если контроллер использует идентификатор пользователя, идентификатор пользователя не указан в сигнатуре метода. В качестве идентификатора пользователя не будет отображаться в пользовательском интерфейсе, созданном Swagger.

Прямо сейчас я экспериментировал с атрибутом SwaggerOperation следующим образом:

[SwaggerOperation("UserValidate(UserID)")]
    public int UserValidate()
    {
            return this._UserValidateService.UserValidate(this.UserID);

И у меня есть собственный параметр swagger, который проверяет все методы, если их имя SwaggerOperation содержит «UserID», и если это так, добавьте заголовок UserID к этому вызову.

Моя проблема с этим заключается в том, что мне приходится вручную проходить каждый вызов и добавлять операцию swagger, и если вызов когда-либо изменится, мы должны помнить также об изменении SwaggerOperation.

Я также подумал о том, чтобы просто добавить 8 к каждому вызову API и пометить их как необязательные, но похоже, что это ужасно раздует пользовательский интерфейс.

Посоветуйте пожалуйста по ситуации. Есть ли варианты, которые я не рассмотрел? Это функциональные возможности Swashbuckle, которые я пропустил, которые решат мои проблемы?

Заранее спасибо.


person Microsoft Excel    schedule 09.02.2017    source источник


Ответы (1)


Если вы используете swashbuckle>=5, вы можете добавить фильтр операций, как показано ниже. Он добавит заголовок только к выбранным запросам:

public class AddHeaderParameter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (context.ApiDescription.HttpMethod.Equals("POST") && context.ApiDescription.RelativePath.Contains("login"))
        {
            if (operation.Parameters == null)
                operation.Parameters = new List<OpenApiParameter>();

            operation.Parameters.Add(new OpenApiParameter
            {
                Name = "UserId",
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema
                {
                    Type = "String",
                },
                Required = true
            });
        }

    }

Выше добавляется обязательный заголовок только для операции POST, в которой имя действия указано как логин.

person Sandeep Tripathi    schedule 08.05.2020