#c# #asp.net #asp.net-web-api #swagger #swashbuckle
Вопрос:
У меня есть ASP.NET Основное приложение, в котором я могу расширить перечисление swagger с помощью,
public class MyParameterFilter : IParameterFilter
{
/// <inheritdoc />
public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
{
var routeInfo = context.ApiParameterDescription.RouteInfo;
if (routeInfo?.Constraints != null amp;amp; routeInfo.Constraints.Any(c => c is MyConstraint))
{
parameter.Schema.Enum = Myvalues.Select(p => new OpenApiString(p)).ToList<IOpenApiAny>();
}
}
}
Теперь я хочу сделать то же самое в своей классической ASP.NET Проект веб-Api, в котором я вижу фильтр документов, фильтр операций и фильтр схем, но нет фильтра параметров. Я имею в виду, что я не смог найти IParameterFilter
Ответ №1:
Используемый фильтр документов,
public class MyDocumentFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
var pathItems = swaggerDoc.paths.Values;
var deletes = pathItems.Select(pathItem => pathItem.delete).Where(o => o?.parameters != null);
var gets = pathItems.Select(pathItem => pathItem.get).Where(o => o?.parameters != null);
var heads = pathItems.Select(pathItem => pathItem.head).Where(o => o?.parameters != null);
var patches = pathItems.Select(pathItem => pathItem.patch).Where(o => o?.parameters != null);
var puts = pathItems.Select(pathItem => pathItem.put).Where(o => o?.parameters != null);
var posts = pathItems.Select(pathItem => pathItem.post).Where(o => o?.parameters != null);
var options = pathItems.Select(pathItem => pathItem.options).Where(o => o?.parameters != null);
var allOperations = deletes.Concat(gets)
.Concat(heads)
.Concat(patches)
.Concat(puts)
.Concat(posts)
.Concat(options)
.ToList();
foreach (Operation operation in allOperations.Where(o => o.parameters.Any(p => p.name == "propName")))
{
operation.parameters.First(p => p.name == "propName").@enum = MyValues.Select(p => (object)p.Name).ToList();
var successResponse = operation.responses.First(d => d.Key == "200").Value;
if (successResponse == null)
{
return;
}
successResponse.examples = MyValues.ToDictionary(d => d.Name, d => "string");
}
}
}