【问题标题】:ASP.NET Core 3.1 OData PageResult SerializationASP.NET Core 3.1 OData PageResult 序列化
【发布时间】:2020-06-25 19:29:18
【问题描述】:

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

[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
}

知道这种行为的原因是什么吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    或者,保留你所拥有的,并使用PageResult 对象:

    return new PageResult&lt;object&gt;(listOfObjects as IEnumerable&lt;object&gt;, Request.GetNextPageLink(5), Request.ODataFeature().TotalCount);

    可以通过如下设置Request.ODataFeature().TotalCountFunc函数来解决Request.ODataFeature().TotalCount不返回值...

    Request.ODataFeature().TotalCountFunc = () =&gt; listOfobjects.Count();

    【讨论】:

    • 感谢您的建议,不幸的是两者的结果相同。我相信文档最终会赶上来,但我能感觉到你的痛苦。我现在认为这实际上可能是System.Text.Json 格式化程序的问题......
    【解决方案2】:
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : ODataController
    {
      [HttpGet]
      [EnableQuery(PageSize=5)]
      public IActionResult Get()
      {
        var items = new List<string> { "value1","value2","value3","value4","value5"  };
     
        return Ok(items);
      }
    }
    

    使用ODataController 而不是ControllerBase 扩展您的控制器。 [EnableQuery] 属性需要添加到方法中。如果您正在执行服务器端分页,则可以定义 PageSize

    【讨论】:

    • 不幸的是,这仍然没有给我想要的回应。我已经用示例回复更新了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2021-11-11
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2021-01-27
    • 2020-08-10
    相关资源
    最近更新 更多