Toujours avoir l’erreur «Le type d’ObjectContent 1 n’a pas réussi à sérialiser le corps de la réponse…»

J’utilise Web api pour récupérer des données de la firebase database. Je n’ai qu’une table “tblMessage” et je veux obtenir des données à partir de cette table.

J’ai tout mis en place, mais quand je lance le site. l’erreur dit toujours

Le type ‘ObjectContent`1’ n’a pas pu sérialiser le corps de la réponse pour le type de contenu ‘application / xml

J’ai lu quelques articles sur stackoverflow qui disaient que l’erreur pourrait être corrigée en disant au navigateur de générer des données au format JSON. Après cela, l’erreur devient

Le type ‘ObjectContent`1’ n’a pas pu sérialiser le corps de la réponse pour le type de contenu ‘application / json

J’ai essayé toutes les solutions des articles suivants, mais ils ne résolvent pas le problème (le navigateur rapporte la même erreur)

Erreur API Web: le type ‘ObjectContent`1’ n’a pas pu sérialiser le corps de la réponse pour le type de contenu

Échec de la sérialisation du corps de la réponse pour le type de contenu

Erreur API Web: le type ‘ObjectContent`1’ n’a pas pu sérialiser le corps de la réponse pour le type de contenu

En quoi consiste exactement cette erreur?

public interface IMessage { IQueryable GetAll(); } public class Message { [Key] public int i_StmID { get; set; } public ssortingng vch_MsgSsortingng { get; set; } } public class EFDBContext : DbContext { public DbSet Message { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity().ToTable("tblMessage"); } } public class MessageRepository : IMessage { private EFDBContext context = new EFDBContext(); public IQueryable GetAll() { return context.tblMessage; } } public class MessageController : ApiController { public IMessage repo = new MessageRepository(); public IEnumerable GetAllMsg() { return repo.GetAll(); } } 

Modifier IEnumerable > en List

 public IEnumerable GetAllMsg() { return repo.GetAll(); } 

à

 public List GetAllMsg() { return repo.GetAll(); } 

UPDATE: Mais méfiez-vous des OutOfMemoryException car cette méthode stockera tous les objects Message dans la mémoire locale. Vous devez donc implémenter une sorte de pagination.

Pour ces types de données, vous devez absolument créer une pagination pour obtenir des résultats. Vous avez 2 options pour la pagination dans Web API.

La première option consiste à utiliser OData pour renvoyer un object IQueryable à partir de votre méthode d’action. Pour que votre action prenne en charge la pagination.

La deuxième option consiste à créer un contrôleur prenant en charge la pagination. Je mets un exemple ci-dessous.

 [HttpGet] public List Books(int page = 0 , int size = 100){ using(var context = new BooksDataContext()){ List books = context.Books.OrderBy(t=> t.CreateDate).Skip(page * size).Take(size).ToList(); return books; } } 

Le code ci-dessus prend en charge la pagination et vous pouvez définir le nombre de collections à renvoyer du côté client.

J’ai eu le même problème avec Chrome, pas tellement avec IE. Afin de résoudre ce problème, j’ai utilisé les lignes suivantes à la méthode Global.asax.cs, Application_Start ():

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

J’ai eu le même problème et c’est la solution que j’ai trouvée

Après la mise à jour du modèle de données Entity, vous devez définir ProxyCreationEnabled sur false dans votre modèle.

Configuration.ProxyCreationEnabled = false;

Mon exemple:

 public partial class EventsEntities : DbContext { public EventsEntities() : base("name=EventsEntities") { Configuration.ProxyCreationEnabled = false; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } }