Web Api (MVC 6) El cuerpo fragmentado no finalizó correctamente con el fragmento de tamaño 0

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

Pregunta

Estoy usando MVC 6 rc1 con EF 7 rc 1 Code First Model para recuperar datos a través del controlador web api. Tengo 3 tablas similares a continuación.

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; }
}

Mi controlador:

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; }
}

A continuación se encuentra mi sección de Startup.cs ConfigureServices.

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; }
}

Cuando llamo a la api, aparece el error porque "El cuerpo fragmentado no finalizó correctamente con el fragmento de tamaño 0" en Fiddler. En el conjunto de resultados del fiddler, solo veo el primer objeto del conjunto de resultados esperado con propiedades hasta que se completen las categorizaciones y NO haya propiedades y objetos restantes después de eso (datos JSON incompletos). Si no incluyo Categorizaciones en el conjunto de resultados, funciona perfectamente bien. ¿Me estoy perdiendo de algo? Nota: EF está devolviendo datos correctamente, pero se está fragmentando en la llamada a la API y el cliente no puede leer los datos completos.

Respuesta popular

Encontré el problema. Se detectó un bucle de autorreferencia para la propiedad 'Producto' con el tipo 'Producto'. Ruta '[0] .Categorizaciones [0]'.

Por lo tanto, EF completa tanto la colección de categorización en el objeto Producto como también el objeto de Producto en la categorización. Entonces, al serializar a json se convirtió en un bucle infinito, como:

Producto> Categorizaciones (eachCategorization - Producto> Categorizaciones (eachCategorization - Producto> Categorizaciones (eachCategorization - Producto> Categorizaciones (...

Solución: Cambie Startup.cs ConfigureServices como se muestra a continuación

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



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué