升级ASP.NET Core 6后ODATA接口Count值无法正常返回如何解决
问题诱因
- .NET 6 对应使用的 Microsoft.AspNetCore.OData 8.x 版本,相比 .NET Core 3.1 配套的 7.x 版本存在多处破坏性变更,直接导致了该问题:
- OData 8.x 默认使用 System.Text.Json 作为序列化器,你仅给 MVC 全局配置了 Newtonsoft.Json,没有适配 OData 自身的序列化逻辑,导致
PageResult中的Count属性未被正确序列化到响应报文中。 - 手动构造返回
PageResult的场景下,OData 8.x 默认不会自动将总计数写入响应顶层字段,需要额外配置适配。 - 你使用的 .NET 6 Preview 版本对应的 OData 预览包存在已知的
PageResult序列化 Bug,会主动忽略 Count 字段输出。
- OData 8.x 默认使用 System.Text.Json 作为序列化器,你仅给 MVC 全局配置了 Newtonsoft.Json,没有适配 OData 自身的序列化逻辑,导致
修复方案
方案1:配置OData兼容Newtonsoft.Json(适配现有代码改动最小)
先安装 NuGet 包 Microsoft.AspNetCore.OData.NewtonsoftJson,再调整 Startup 中的服务注册代码:
services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); }).AddOData(opt => opt .EnableQueryFeatures() .AddRouteComponents("odata", GetEdmModel()) ) // 新增以下配置,让OData使用Newtonsoft.Json完成序列化 .AddODataNewtonsoftJson();
修改完成后重启项目即可正常返回 Count 字段。
方案2:改用OData内置查询逻辑(推荐写法)
不需要手动构造 PageResult 和处理 ODataQueryOptions,直接交给 OData 自动处理查询、分页、计数逻辑,写法更简洁也能规避序列化问题:
[Route("odata/Tasks")] [EnableQuery] // 按需配置PageSize等参数 public IQueryable<TaskModel> AjaxListOData() { return dataContext.Tasks; }
前端请求时携带 $count=true 参数即可自动在响应中返回总计数。
预览版Bug修复方案
如果上述方案都不生效,可直接将 Microsoft.AspNetCore.OData 包升级到 8.0 及以上正式版,即可修复预览版本的序列化Bug。
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

