首页 > 解决方案 > Net Core 2.1 控制器在 json 没有引用循环时截断 Json

问题描述

我正在努力处理网络核心返回截断的响应。我已经在我的启动服务中定义了没有引用循环,并且还尝试为我当前使用的 2.1 版本设置兼容版本,如下所示:

services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

我还尝试使用 JsonConvert 序列化数组,它没有引发任何引用循环异常。这是控制器中的操作和 serializedArray 文本:

 public IActionResult GetProductItems(int productId)
 {
     try
     {
         var productItems = _productsMethods.GetProductItems(productId);

         // for testing the object for ref loops
         string serialized = Newtonsoft.Json.JsonConvert.SerializeObject(productItems);

         return Ok(productItems);
     }
     catch (ClientException ex)
     {
         return BadRequest(new { message = ex.Message });
     }
     catch (Exception ex)
     {
         return StatusCode(500, new { message = ex.Message });
     }
 }

// serialized string
//[{"ID":2,"ProductId":6,"ItemId":4,"Product":null,"Item":null,"Orders":[]},{"ID":3,"ProductId":":6,"ItemId":1,"Product":null,"Item":null,"Orders":[]},{"ID":5,"ProductId":":6,"ItemId":2,"Product":null,"Item":null,"Orders":[]}]

这是实际的反应

[{"id":2,"productId":6,"itemId":4,"product":null,"item":null,"orders":

方法:

public List<ProductItem> GetProductItems(int productId)
{
    IQueryable<DataSets.ProductItem> query = db.ProductItems
        .AsNoTracking()
        .Include(k => k.Orders)
        .Where(k => k.ProductId == productId);

    // result truncated (when array orders is empty)
    //return query.Select(_mapper.Map<ProductItem>).ToList();

    // without automapper, also truncated
    //return query.Select(k => new ProductItem()
    //{
    //    ID = k.ID,
    //    ItemId = k.ItemId,
    //    ProductId = k.ProductId,
    //    Orders = k.Orders.Select(a => new Order() { ID = a.ID })
    //    .ToList()
    //}).ToList();

    // WORKS, not getting truncated 
    // order not included 
    return query.Select(k => new ProductItem()
    {
        ID = k.ID,
        ItemId = k.ItemId,
        ProductId = k.ProductId,
    }).ToList();
}

实体(为简化起见,重命名和删除了道具):

public class Product
{
    public int ID { get; set; }
  
    // some props

    public string UserId { get; set; }
    public User User { get; set; }

    public List<ProductItem> Items { get; set; }
}

public class ProductItem
{
    public int ID { get; set; }

    // some props

    public int ProductId { get; set; }
    public int ItemId { get; set; }

    public Product Product { get; set; }
    public Item Item { get; set; }

    public List<Order> Orders { get; set; }
}

public class Order
{
    public int ID { get; set; }
    
    // some props

    public int ItemId { get; set; }
    public ProductItemOrder Item { get; set; }
}

由于没有参考循环,orders并且参考循环也被忽略。为什么这仍然截断?

标签: asp.net-coreentity-framework-core

解决方案


我认为问题是public Product Product { get; set; }这里的一部分。您应该虚拟定义您的 Product 实体。

下面是一个例子,

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public string Tags { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

这里是来源。


推荐阅读