Добавьте фильтр для заголовка в Swagger для ASP. NET Core 3.1 - PullRequest
1 голос
/ 04 марта 2020

Я следовал этому:

Web Api Как добавить параметр заголовка для всех API в Swagger

и это:

Как отправлять пользовательские заголовки с запросами в Swagger UI?

Однако ни один из этих IParameter, Parameter или NonBodyParameters не работает на ASP. NET CORE 3.1.

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

Я также прошел через это:

https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Кто-нибудь может указать мне правильное направление?

using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.JsonPatch.Operations;
using Microsoft.OpenApi.Models;

namespace Intent2.Auth.Utils
{
    public class AddRequiredHeaderParameter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {

            if (operation.Parameters == null)
                operation.Parameters = new List<IParameter>();

            operation.Parameters.Add(new NonBodyParameter
            {
                Name = "X-User-Token",
                In = "header",
                Type = "string",
                Required = false
            });
        }
    }
}
  services.AddSwaggerGen(options =>
            {
                options.OperationFilter<AddRequiredHeaderParameter>();
            }

1 Ответ

2 голосов
/ 04 марта 2020

В последней версии Swashbuckle, совместимой с ASP. NET Core 3.1, многие типы были заменены эквивалентными типами в пространстве имен Microsoft.OpenApi.Models. Поэтому вы не должны больше использовать такие типы, как NonBodyParameter или IParameter. Оба они были заменены одним классом OpenApiParameter.

Ваш код должен выглядеть следующим образом

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Collections.Generic;

namespace Intent2.Auth.Utils
{
    public class AddRequiredHeaderParameter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {

            if (operation.Parameters == null)
                operation.Parameters = new List<OpenApiParameter>();

            operation.Parameters.Add(new OpenApiParameter()
            {
                Name = "X-User-Token",
                Description = "Access Token",
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema() { Type = "String" },
                Required = true,
                Example = new OpenApiString("Tenant ID example")
            });
        }
    }
}

Затем при запуске просто введите SwaggerGen как обычно

services.AddSwaggerGen(options =>
{
    options.OperationFilter<AddRequiredHeaderParameter>();
}

Вы даже можете сделать идентификатор арендатора, поступающий извне, как, например, файл конфигурации. Для этого измените ваш AddRequiredHeaderParameter следующим образом

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;

namespace Intent2.Auth.Utils
{
    public class AddRequiredHeaderParameter : IOperationFilter
    {
        private string _tenantIdExample;

        public AddRequiredHeaderParameter(string tenantIdExample)
        {
            _tenantIdExample = tenantIdExample ?? throw new ArgumentNullException(nameof(tenantIdExample));
        }

        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {

            if (operation.Parameters == null)
                operation.Parameters = new List<OpenApiParameter>();

            operation.Parameters.Add(new OpenApiParameter()
            {
                Name = "X-User-Token",
                Description = "Access Token",
                In = ParameterLocation.Header,
                Schema = new OpenApiSchema() { Type = "String" },
                Required = true,
                Example = new OpenApiString(_tenantIdExample)
            });
        }
    }
}

И назовите его так из своего стартапа

services.AddSwaggerGen(options =>
{
    options.OperationFilter<AddRequiredHeaderParameter>("Tenant ID example");
}

Кстати, я думаю, что ваш класс называется AddRequiredHeaderParameter вы должны установить Required = true вместо false

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...