c# - ASP.NET Core 3.1 OData PageResult 序列化

标签 c# asp.net-core odata system.text.json

PageResult响应缺少 nextPageLinkcount通过 System.Text.Json 序列化时的值(ASP.NET Core 3 默认)为以下结果:

[ApiController]
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
  [HttpGet]
  public IActionResult Get()
  {
    var items = new List<string> { "value" };

    var pageResult = new Microsoft.AspNet.OData.PageResult<string>(items, new Uri("http://localhost/foo"), items.Count);

    return Ok(pageResult);
  }
}
但是,当我使用 Newtonsoft.Json formatter 时,结果正确:
public void ConfigureServices(IServiceCollection services)
{
  services.AddControllers().AddNewtonsoftJson();
}
结果与 System.Text.Json :
[
    "value"
]
结果与 Newtonsoft.Json :
{
    "items": [
        "value"
    ],
    "nextPageLink": "http://localhost/foo",
    "count": 1
}
知道这种行为的原因是什么吗?

最佳答案

在重新阅读问题时,这并没有直接回答为什么 OP 的问题,即为什么一个格式化程序会这样做而另一个不会导致正确的输出,但可能会为 OP 提供一些开始寻找的地方......

我在使用 OData 和 Asp.Net Core 时也看到了一些有趣的行为,很难从在线文档中解读这些天你应该做什么,因为大多数文档似乎已经过时或适用于 OData 的早期版本。例如,您会在某些文档中看到一些对 GetInlineCount() 的引用,但它似乎已从 API 中删除。

对于您的查询,我认为您有两种选择
首先,将您的返回类型更改为 IQueryable 然后
指定属性 [EnableQuery(PageSize=10)] .

或者,保留你所拥有的,并使用 PageResult目的:
return new PageResult<object>(listOfObjects as IEnumerable<object>, Request.GetNextPageLink(5), Request.ODataFeature().TotalCount);
您可以通过如下设置 Request.ODataFeature().TotalCountFunc 函数来解决 Request.ODataFeature().TotalCount 不返回值的问题...
Request.ODataFeature().TotalCountFunc = () => listOfobjects.Count();

关于c# - ASP.NET Core 3.1 OData PageResult 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59844505/

相关文章:

java - ReSTLet 是否支持批处理?

c# - itextsharp : Adding multiple pages

c# - 在程序集中查找嵌入的资源名称?

odata - OData 和存储库模式中的 IEnumerable 与 IQueryable

java - Olingo v2 - 如何编写带有导航实体的实体

c# - 如何使用基于声明的授权保护 asp.net core 2.1 中的静态文件夹

c# - 遍历 XAML 定义的标签

c# - 我如何等待 BackgroundWorker?

asp.net-core - 如何在 Entity Framework Core 中获取映射实体的表名称

asp.net-core - 使用Windows Auth对用户进行身份验证,然后在ASPNET Core 2.1中生成JWT