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

Я искал возможные способы добавления параметра заголовка запроса, который будет автоматически добавлен к каждому методу в моем web-api, но я не смог найти четкий.

Во время поиска я обнаружил, что метод OperationFilter() должен что-то сделать.

Ответ 1

Да, вы можете сделать это путем наследования от IOperationFilter

Вы можете найти ответ на GitHub здесь: AddRequiredHeaderParameter

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;

public class AddRequiredHeaderParameter : IOperationFilter
{
    public void Apply(Operation 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
            });
    }
}

Затем перейдите к файлу SwaggerConfig.cs и добавьте следующее в раздел AddSwaggerGen:

c.OperationFilter<AddRequiredHeaderParameter>();

Восстановите и наслаждайтесь.

Ответ 2

Другой способ добавления пользовательских заголовков - добавление параметров в действие контроллера.
Следующий пример добавит параметр x-test в пользовательский интерфейс:

[HttpPost]
public IActionResult Test([FromHeader(Name="x-test")][Required] string requiredHeader)
{
    return Ok();
}

enter image description here

Ответ 3

То, что написал пользователь "G T", верно, но оно не работает с Swagger 5. У нас есть несколько новых изменений: От: "Операция" до: "OpenApiOperation". От: "IParameter" до: "OpenApiParameter". От: "NonBodyParameter" до: "OpenApiParameter". И самое важное из: "Type =" string "" to: "Schema = new OpenApiSchema {Type =" String "}".

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace MyAPI
{
    public class AuthorizationHeaderParameterOperationFilter: IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var filterPipeline = context.ApiDescription.ActionDescriptor.FilterDescriptors;
            var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is AuthorizeFilter);
            var allowAnonymous = filterPipeline.Select(filterInfo => filterInfo.Filter).Any(filter => filter is IAllowAnonymousFilter);

            if (isAuthorized && !allowAnonymous)
            {
                if (operation.Parameters == null)
                    operation.Parameters = new List<OpenApiParameter>();

                operation.Parameters.Add(new OpenApiParameter 
                {
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Description = "access token",
                    Required = true,
                    Schema = new OpenApiSchema
                    {
                        Type = "String",
                        Default = new OpenApiString("Bearer ")
                    }
                });
            }
        }
    }
}

А при запуске => ConfigureServices (

c.OperationFilter<AuthorizationHeaderParameterOperationFilter>();

Ответ 4

Я должен был сделать это немного по-другому, не знаю почему. Вот что я сделал, чтобы добавить значение заголовка:

Это было добавлено в мой конфиг:

    c.OperationFilter<AddRequiredHeaderParameter>();

И это был класс:

    public class AddRequiredHeaderParameter : IOperationFilter
    {
        public void Apply(Operation operation, OperationFilterContext context)
        {
            operation.Parameters.Add(new NonBodyParameter
            {
                Name = "X-MYHEADER",
                In = "header",
                Type = "string",
                Required = false
            });
        }
    }

Ответ 5

Также вы можете иметь базовый класс модели и использовать атрибут [FromHeader] для свойств, которые следует отправлять в пользовательских заголовках. Что-то вроде этого:

public class AuthenticatedRequest
{
    [FromHeader(Name = "User-Identity")]
    public string UserIdentity { get; set; }
}

По крайней мере, он отлично работает для ASP.NET Core 2.1 и Swashbuckle.AspNetCore 2.5.0.

Ответ 6

Для Asp.Net MVC 5 вы можете использовать.
Следующее необходимо сделать в файле конфигурации Swagger.

private class AddAuthorizationHeaderParameter: IOperationFilter   // as a nested class in script config file.
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters == null)
            operation.parameters = new List<Parameter>();

        operation.parameters.Add(new Parameter
        {
            name = "Authorization",
            @in = "header",
            type = "string",
            required = true
        });
    }
}

c.OperationFilter<AddAuthorizationHeaderParameter>(); // finally add this line in .EnableSwagger

Вы также можете добавить любое количество заголовков для реализации заголовков в Swagger.