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