我有一个 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文档中正确显示?
这可能有点晚了,但它可以帮助某人:
当您为项目中的控制器启用 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);
}
}
}
}