Я искал возможные способы добавления параметра заголовка запроса, который будет автоматически добавлен к каждому методу в моем web-api
, но я не смог найти четкий.
Во время поиска я обнаружил, что метод OperationFilter()
должен что-то сделать.
Я искал возможные способы добавления параметра заголовка запроса, который будет автоматически добавлен к каждому методу в моем web-api
, но я не смог найти четкий.
Во время поиска я обнаружил, что метод OperationFilter()
должен что-то сделать.
Да, вы можете сделать это путем наследования от 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>();
Восстановите и наслаждайтесь.
Другой способ добавления пользовательских заголовков - добавление параметров в действие контроллера.
Следующий пример добавит параметр x-test
в пользовательский интерфейс:
[HttpPost]
public IActionResult Test([FromHeader(Name="x-test")][Required] string requiredHeader)
{
return Ok();
}
То, что написал пользователь "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>();
Я должен был сделать это немного по-другому, не знаю почему. Вот что я сделал, чтобы добавить значение заголовка:
Это было добавлено в мой конфиг:
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
});
}
}
Также вы можете иметь базовый класс модели и использовать атрибут [FromHeader] для свойств, которые следует отправлять в пользовательских заголовках. Что-то вроде этого:
public class AuthenticatedRequest
{
[FromHeader(Name = "User-Identity")]
public string UserIdentity { get; set; }
}
По крайней мере, он отлично работает для ASP.NET Core 2.1 и Swashbuckle.AspNetCore 2.5.0.
Для 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.