c# – Web Api(MVC 6)Chunked body没有正确终止0大小的块

前端之家收集整理的这篇文章主要介绍了c# – Web Api(MVC 6)Chunked body没有正确终止0大小的块前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用MVC 6 rc1与EF 7 rc 1 Code First Model通过web api控制器检索数据.
我有3个类似于下面的表.
  1. class Product
  2. {
  3. public int Id { get; set; }
  4. public string SomeProperty { get; set; }
  5. public virtual ICollection<Categorization> Categorizations { get; set; }
  6. public DateTime SomeProperty2 { get; set; }
  7. public string SomeProperty3 { get; set; }
  8. public string SomeProperty4 { get; set; }
  9.  
  10. }
  11.  
  12. // NOTE: Entity key should be (ProductId,CategoryId)
  13. class Categorization
  14. {
  15. public int ProductId { get; set; }
  16. public Product Product { get; set; }
  17.  
  18. public int CategoryId { get; set; }
  19. public Category Category { get; set; }
  20. }
  21.  
  22. class Category
  23. {
  24. public int Id { get; set; }
  25. public ICollection<Categorization> Categorizations { get; set; }
  26. }

我的控制器:

  1. [ActionName("searchProducts")]
  2. public IEnumerable<Product> searchProducts(string searchText,int? id)
  3. {
  4. var ret= db.Products
  5. .Include(s => s.Categorizations).Take(2).ToList();
  6. return ret;
  7. }

下面是我的Startup.cs ConfigureServices部分.

  1. services.AddMvc()
  2. .AddJsonOptions(options=>
  3. {
  4. options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  5. options.SerializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
  6. });
  7. services.AddCors();
  8.  
  9. var connectionString = Configuration.GetSection("Data:DefaultConnection:ConnectionString").Value;
  10.  
  11. services.AddEntityFramework()
  12. .AddsqlServer()
  13. .AddDbContext<ContractsContext>(options => options.UsesqlServer(connectionString));
  14.  
  15.  
  16. services.AddSingleton(_ => Configuration);
  17. services.AddSingleton<IContractRepository,ContractRepository>();

当我调用api时,我得到的错误是“在Fiddler中,Chunked body没有正确地终止0大小的块”.在fiddler结果集中,我只看到具有属性的预期结果集的第一个对象,直到填充了分类并且在此之后没有属性和剩余对象(不完整的JSON数据).如果我在结果集中不包含分类,则它可以正常工作.我错过了什么吗?
注意:EF正确地返回数据,但它在api调用中被分块,客户端无法完整地读取数据.

解决方法

发现了这个问题.
检测到属性“Product”的自引用循环,类型为“Product”.路径'[0] .Categorizations [0]’.

因此,EF会填写Product对象中的Categorization集合以及Categorization中的Product对象.因此,在序列化为json时,它变成了一个无限循环,如:

产品>分类(eachCategorization – Product> Categorizations(eachCategorization – Product> Categorizations(eachCategorization – Product> Categorizations(….

解:
更改Startup.cs ConfigureServices部分,如下所示

  1. services.AddMvc()
  2. .AddJsonOptions(options =>
  3. {
  4. options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
  5. });

猜你在找的C#相关文章