Web Api (MVC 6) Il corpo Chunked non è stato terminato correttamente con un blocco di dimensioni 0

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

Domanda

Sto utilizzando MVC 6 rc1 con EF 7 rc 1 Code First Model per recuperare i dati tramite il controller web api. Ho 3 tavoli simili al di sotto.

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

Il mio controller:

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

Di seguito è la mia sezione Startup.cs ConfiguraServizi.

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

Quando chiamo l'API, ottengo l'errore come "Corpo Chunked non terminato correttamente con un chunk di dimensioni 0" in Fiddler. Nel set di risultati del violinista, vedo solo il primo oggetto del set di risultati attesi con le proprietà fino a quando non vengono compilate le Categorizzazioni e le proprietà NO e gli oggetti rimanenti dopo (Dati JSON incompleti). Se non includo le categorizzazioni nel set di risultati, funziona perfettamente bene. Mi sto perdendo qualcosa? Nota: EF sta restituendo i dati correttamente, ma sta diventando frammentato nella chiamata api e il client non è in grado di leggere i dati in modo completo.

Risposta popolare

Trovato il problema. Ciclo di autoriferimento rilevato per proprietà "Prodotto" con tipo "Prodotto". Path '[0] .Categorizations [0]'.

Pertanto, EF compila sia la raccolta della categorizzazione nell'oggetto Product che l'oggetto Product nella categoria. Quindi, mentre serializzava su json, divenne un ciclo infinito, come:

Prodotto> Categorizzazioni (ciascuna categoria - Prodotto> Classificazioni (ciascuna categoria - Prodotto> Classificazioni (ogni categoria - Prodotto> Categorizzazioni (....

Soluzione: modificare la sezione Startup.cs ConfiguraServices come di seguito

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché