首页 > 解决方案 > Asp.Net Core Web API 2.2 控制器不返回完整的 JSON

问题描述

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

每当我向 MessageBoards 发出 GET 请求时,只会返回正确 JSON 的一部分。这是从https://localhost:44384/api/MessageBoards/Postman 上访问返回的 JSON:

[{"id":1,"name":"Test Board 2","description":"用于测试目的的第二个留言板。","messages":[{"id":1,"text":"发布我的第一条消息!","user":"Jesse","postedDate":"2019-01-01T00:00:00","messageBoardId":1

JSON 被截断(因此它是一个丑陋的块并且没有被 Postman 美化),可能是由于模型MessageBoard上的属性,Message因为它是第一个丢失的 JSON 项。

如何使操作正确返回 MessageBoards 和子消息列表?

标签: c#asp.net-coreasp.net-core-mvcasp.net-core-webapi

解决方案


我看到您Eager Loading在查询中使用。因此,在您的类中添加以下配置Startup以忽略它在对象图中找到的循环并正确生成JSON响应。

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}

有关更多详细信息: EF Core 中的相关数据和序列化


推荐阅读