Фильтр параметров Swagger в ASP.NET Веб-Api

#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");
        }
    }
}