带有 OdataQueryOptions 的 ASP.NET Core Web API 方法未在 swagger 文档中正确显示

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

我有一个 ASP.NET Core 3.1 Web API,使用 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);
        });
}

对于

GET
操作:

[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.