带有 OdataQueryOptions 的 WebApi 方法未在 swagger 文档中正确显示

问题描述 投票:0回答:1

其余API项目: 使用: dotnet 核心 3.1,swashbuckle.AspNetCore 5.3.3。 使用非 Edm 方法实施 Odata。

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers(mvcOptions =>
            mvcOptions.EnableEndpointRouting = false).AddNewtonsoftJson();
        services.AddOData();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseMvc(routerBuilder =>
        {
            routerBuilder.EnableDependencyInjection();
           routerBuilder.Expand().Select().Count().OrderBy().Filter().MaxTop(100);
        });
    }

对于获取操作,

    [HttpGet]
    [EnableQuery]
    [ProducesResponseType(typeof(List<OutputDto>), 200)]
    [RequestHeaderMatchesMediaType("Accept", new[] { HttpMediaTypes })]        
    public async Task<IActionResult> Get(InputForGetDto input, ODataQueryOptions<OutputDto> options, [FromServices] IRepo<repository> _repository,
        [FromServices] IMapper _mapper)

在swagger文档中,这个get操作无法正常扩展。 swagger 文档页面没有得到任何回复,并且在很长的等待时间里死掉了。 在swagger页面的schema部分发现很多不必要的信息: 招摇模式

如何使此操作在 swagger 文档上正确显示?

swagger asp.net-core-webapi swagger-editor
1个回答
0
投票

这可能有点晚了,但它可以帮助某人:

当您为项目中的控制器启用 OData 查询选项(其中该控制器不是 OData 端点)时,如果您使用

,您将面临相同的问题

[FromQuery] ODataQueryOptions<OutputDto> options

解决此问题的方法是使用

builder.Services.AddControllers().AddOData(opt => opt.Filter().Select().OrderBy())
在你的程序中.cs

然后向控制器添加参数,例如

[FromQuery] string? filter, [FromQuery] string? orderby
这些参数不会被使用,但会绑定到选项或编写自定义过滤器

public class EnableQueryFilter : IOperationFilter
    {
        static readonly List<OpenApiParameter> s_Parameters = (new List<(string Name, string Description)>()
            {
               ( "filter", ""),
                ("orderby", ""),
            }).ConvertAll(pair => new OpenApiParameter
            {
                Name = pair.Name,
                Required = false,
                Schema = new OpenApiSchema { Type = "String" },
                In = ParameterLocation.Query,
                Description = pair.Description,
            });

        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            if (context.ApiDescription.ActionDescriptor.RouteValues.TryGetValue("action", out var name) && name == "GetReviewObjects")
            {
                operation.Parameters ??= new List<OpenApiParameter>();
                foreach (var item in s_Parameters)
                    operation.Parameters.Add(item);
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.