Web Api (MVC 6) Черепованное тело не заканчивалось должным образом с размером пор 0

asp.net-core-mvc asp.net-mvc asp.net-web-api c# entity-framework-core

Вопрос

Я использую MVC 6 rc1 с EF 7 rc 1 Code First Model для извлечения данных через web-контроллер api. У меня 3 таблицы, похожие на ниже.

class Product
{
    public int Id { get; set; }
    public string SomeProperty { get; set; }
    public virtual ICollection<Categorization> Categorizations { get; set; }
    public DateTime SomeProperty2 { get; set; }
    public string SomeProperty3 { get; set; }
    public string SomeProperty4 { get; set; }

}

// NOTE: Entity key should be (ProductId, CategoryId)
class Categorization
{
    public int ProductId { get; set; }
    public Product Product { get; set; }

    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

class Category
{
    public int Id { get; set; }
    public ICollection<Categorization> Categorizations { get; set; }
}

Мой контроллер:

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

Ниже приведен раздел My Startup.cs ConfigureServices.

          services.AddMvc()
                .AddJsonOptions(options=>
                {
                    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                    options.SerializerSettings.MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore;
                });
            services.AddCors();

            var connectionString = Configuration.GetSection("Data:DefaultConnection:ConnectionString").Value;

            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<ContractsContext>(options => options.UseSqlServer(connectionString));


            services.AddSingleton(_ => Configuration);
            services.AddSingleton<IContractRepository, ContractRepository>();

Когда я вызываю api, я получаю ошибку, так как «Chunked body не заканчивается должным образом с размером в 0 размера» в Fiddler. В наборе результатов fiddler я вижу только первый объект ожидаемого результата, заданный со свойствами, до тех пор, пока не будут заполнены Категоризации и нет свойств и оставшихся объектов после этого (Неполные данные JSON). Если я не включаю Категоризации в набор результатов, он работает отлично. Я что-то упускаю? Примечание: EF корректно возвращает данные, но он получает chunked в вызове api, и клиент не может прочитать данные в полном объеме.

Популярные ответы

Нашел вопрос. Обнаружен цикл саморегуляции для свойства «Продукт» с типом «Продукт». Path '[0]. Категоризация [0]'.

Таким образом, EF заполняет коллекцию категоризации в объекте Product, а также объект Product в разделе «Категоризация». Таким образом, при сериализации в json он стал бесконечным циклом, например:

Продукт> Категоризация (каждая категоризация - продукт) Категоризация (каждая категория - продукт) Категории (каждая категоризация - продукт) Категория (....

Решение. Измените раздел Startup.cs ConfigureServices, как показано ниже.

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow