Контроллер Asp.Net Core Web API 2.2 не возвращает полный JSON - PullRequest
0 голосов
/ 11 февраля 2019

В моем проекте Asp.Net Core Web API 2.2 есть контроллер Web API.

Messageboard модель:

public class MessageBoard
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public ICollection<Message> Messages { get; set; }
    }

Message модель:

public class Message
    {
        public long Id { get; set; }
        public string Text { get; set; }
        public string User { get; set; }
        public DateTime PostedDate { get; set; }

        public long MessageBoardId { get; set; }
        [ForeignKey("MessageBoardId")]
        public MessageBoard MessageBoard { get; set; }
    }

Это одно из моих действий контроллера Web API, сокращенное для краткости:

[Route("api/[controller]")]
[ApiController]
public class MessageBoardsController : ControllerBase
{        
      // GET: api/MessageBoards
      [HttpGet]
      public async Task<ActionResult<IEnumerable<MessageBoard>>> GetMessageBoards()
      {
         return await _context.MessageBoards
            .Include(i => i.Messages)
            .ToListAsync();
      }
}

Всякий раз, когда я отправляю GET-запрос к MessageBoards, возвращается только часть правильного JSON.Вот возвращенный JSON от доступа к https://localhost:44384/api/MessageBoards/ на Почтальоне:

[{"id": 1, "name": "Test Board 2", "description": "Вторая доска сообщений дляцели тестирования. "," messages ": [{" id ": 1," text ":" Отправка моего первого сообщения! "," user ":" Jesse "," postsDate ":" 2019-01-01T00: 00:00 "," messageBoardId ": 1

JSON обрезан (следовательно, это уродливый блок и не украшен почтальоном), предположительно из-за свойства MessageBoard в Messageмодель, поскольку это первый отсутствующий элемент JSON.

Как сделать так, чтобы действие правильно возвращало список досок сообщений и дочерних сообщений?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я вижу, вы используете Eager Loading в своем запросе.Поэтому добавьте следующую конфигурацию в ваш класс Startup, чтобы игнорировать циклы, которые он находит в графе объектов, и правильно генерировать ответ JSON.

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}

Для получения более подробной информации: Связанные данные и сериализацияв EF Core

0 голосов
/ 11 февраля 2019

Попытайтесь создать и вернуть DTO или новую структуру / класс, который не будет иметь циклической информации (MessageBoard имеет Message, который имеет MessageBoard и т. Д ...)

...