ASP. NET Core 3.1 OData PageResult Сериализация - PullRequest
1 голос
/ 21 января 2020

В ответе PageResult отсутствуют значения nextPageLink и count при сериализации через 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 форматер , результат будет правильным:

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllers().AddNewtonsoftJson();
}

Есть идеи, в чем причина такого поведения?

1 Ответ

0 голосов
/ 21 января 2020

Повторное чтение вопроса не дает прямого ответа на вопрос о том, почему вопрос 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 (). TotalCount не возвращая значение, установив функцию Request.ODataFeature (). TotalCountFun c следующим образом ...

Request.ODataFeature().TotalCountFunc = () => listOfobjects.Count();

...