You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级ASP.NET Core 6后ODATA接口Count值无法正常返回如何解决

问题诱因

  • .NET 6 对应使用的 Microsoft.AspNetCore.OData 8.x 版本,相比 .NET Core 3.1 配套的 7.x 版本存在多处破坏性变更,直接导致了该问题:
    1. OData 8.x 默认使用 System.Text.Json 作为序列化器,你仅给 MVC 全局配置了 Newtonsoft.Json,没有适配 OData 自身的序列化逻辑,导致 PageResult 中的 Count 属性未被正确序列化到响应报文中。
    2. 手动构造返回 PageResult 的场景下,OData 8.x 默认不会自动将总计数写入响应顶层字段,需要额外配置适配。
    3. 你使用的 .NET 6 Preview 版本对应的 OData 预览包存在已知的 PageResult 序列化 Bug,会主动忽略 Count 字段输出。

修复方案

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:21:00