Web Api (MVC 6) Le corps avec bloc ne s'est pas terminé correctement avec un morceau de taille 0

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

Question

J'utilise MVC 6 rc1 avec EF 7 rc 1 Code First Model pour récupérer des données via un contrôleur API Web. J'ai 3 tables similaires à ci-dessous.

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

Mon contrôleur:

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

Vous trouverez ci-dessous ma section ConfigureServices Startup.cs.

          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>();

Lorsque j'appelle l'api, j'obtiens le message d'erreur suivant: "Le corps du bloc ne s'est pas terminé correctement avec un morceau de taille 0" dans Fiddler. Dans Fiddler Resultset, je ne vois que le premier objet de l'ensemble de résultats attendus avec les propriétés jusqu'à ce que les catégorisations soient remplies, les propriétés NO et les objets restants (données JSON incomplètes). Si je n'inclue pas les catégories dans le jeu de résultats, cela fonctionne parfaitement. Est-ce que je manque quelque chose? Remarque: EF renvoie correctement les données, mais celles-ci sont fragmentées lors de l'appel de l'API et le client ne peut pas les lire intégralement.

Réponse populaire

Trouvé le problème. Boucle d'auto-référencement détectée pour la propriété 'Produit' de type 'Produit'. Chemin '[0] .Categorizations [0]'.

Ainsi, EF remplit à la fois la collection de catégorisation dans l'objet produit et également l'objet produit dans la catégorisation. Ainsi, lors de la sérialisation en JSON, il est devenu une boucle infinie, comme:

Produit> Catégorisations (eachCategorization - Produit> Catégorisations (eachCategorization - Produit> Catégorisations (eachCategorization - Produit> Catégories> (....

Solution: Modifier la section StartS.cs ConfigureServices comme ci-dessous

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow