Сериализация результатов OData в ASP.NET Core 3.1

В 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();
}

Результат с System.Text.Json:

[
    "value"
]

Результат с Newtonsoft.Json:

{
    "items": [
        "value"
    ],
    "nextPageLink": "http://localhost/foo",
    "count": 1
}

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

2 ответа

При повторном чтении вопроса это не дает прямого ответа, почему вопрос 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().TotalCountFunc следующим образом...

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

[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 если вы выполняете подкачку на стороне сервера.

Другие вопросы по тегам