.NET Core 5搭配OData 8控制器使用[EnableQuery]时自定义响应失效问题
问题根因
标注[EnableQuery]特性后,OData会在控制器Action执行完成后自动执行查询校验、查询应用逻辑,你在校验失败时返回的BadRequest结果不是可应用OData查询的集合类型,OData的默认校验逻辑会识别到返回值不符合要求,直接抛出内置错误覆盖你自定义的响应内容。
解决方案1:手动控制OData查询执行(最直观)
移除方法上的[EnableQuery]特性,仅在校验全部通过后手动应用OData查询,代码示例:
[HttpGet] public IActionResult GetList(ODataQueryOptions<List> queryOptions) { if (queryOptions.Filter == null) { return BadRequest( "Filter is required for this endpoind!" ); } try { queryOptions.Filter.Validator = new OdataCustomFilterValidator(); this.BaseValidateQueryOptions(queryOptions); } catch (ODataException ex) { return this.BadRequest(ex.Message); } IQueryable<List> list = this._service.GetList(); // 手动应用OData查询规则 var result = queryOptions.ApplyTo(list, new ODataQuerySettings() { EnsureStableOrdering = false }); return this.Ok(result); }
解决方案2:自定义EnableQuery特性跳过失败响应的处理
继承默认的EnableQueryAttribute,重写执行逻辑,若Action已经返回错误响应则不执行后续OData查询处理,无需修改原有业务代码:
public class CustomEnableQueryAttribute : EnableQueryAttribute { public override void OnActionExecuted(ActionExecutedContext context) { // 如果Action已经返回非2xx状态的结果,直接跳过OData处理逻辑 if (context.Result is not ObjectResult res || res.StatusCode is < 200 or >= 300) { return; } base.OnActionExecuted(context); } }
之后把控制器方法上的[EnableQuery(EnsureStableOrdering = false )]替换为[CustomEnableQuery(EnsureStableOrdering = false )]即可。
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

