asp.net-core - 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
并且参考循环也被忽略。为什么这仍然截断?
解决方案
我认为问题是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; }
}
推荐阅读
- swift - 如何在 UIView Container UIViewController 中停止内存泄漏
- grails - 为什么 grails 源不在 /src 文件夹中?
- java - java.lang.NoClassDefFoundError: gherkin/IGherkinDialectProvider 在运行 Selenium-Cucumber 测试时
- grammar - 语法中空格方法ws的默认定义
- html - 如何将 swf 文件嵌入到网站上的浮动 iframe 中。书签?
- python - 使用 re 替换数组的一部分
- sql-server - 尝试使用 SQL Server 后端分发访问应用程序
- django - 为什么迁移不起作用,它既不会在 django 应用程序中创建迁移目录
- android - 在android中滚动底部工作表的问题
- c# - 如何仅 Ping IPv4?