Je travaillais sur l'API Web ASP.NET MVC, j'ai cette erreur:
Le type 'ObjectContent`1' n'a pas réussi à sérialiser le corps de la réponse pour le type de contenu 'application / xml; jeu de caractères = utf-8 '.
Mon contrôleur est:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
pourquoi j'obtiens cette erreur?
c#
serialization
asp.net-web-api
Tamal kanti Dey
la source
la source
InnerException
propriété de l'exception de sérialisation pour savoir ce qui a exactement provoqué l'échec de la sérialisation.Réponses:
Pour moi, c'était un problème avec le référencement circulaire.
La réponse acceptée n'a pas fonctionné pour moi car elle ne modifie que le comportement du formateur JSON, mais j'obtenais du XML lorsque j'ai appelé le service depuis le navigateur.
Pour résoudre ce problème, j'ai désactivé XML et forcé uniquement le retour de JSON.
Dans le fichier Global.asax, placez les lignes suivantes en haut de votre méthode Application_Start:
Désormais, seuls les résultats JSON seront renvoyés. Si vous avez besoin de résultats XML, vous devrez trouver une solution différente.
la source
dans votre fichier global.asax, dans la méthode Application_start () ajoutez cette ligne:
J'espère que cela vous aide!
la source
Global.asax
deApplication_Start
, mais pas de changement.J'ai le même problème. Et je l'ai résolu. J'ai mis le constructeur par défaut dans la classe DTO.
Ex:
public class User { public User() { } }
J'espère que cela fonctionnera avec vous!
la source
Mettez ceci dans le constructeur. J'espère que cela résoudra le problème:
public MyController() { db.Configuration.ProxyCreationEnabled = false; }
la source
J'ai trouvé deux solutions à cela. Le premier et le plus simple à implémenter est de changer les IEnumerables, ICollections en un type de List. WebAPI peut sérialiser ces objets, mais ne peut pas sérialiser les types d'interface.
public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here }
L'autre option consiste à ne pas utiliser le sérialiseur JSON natif et à exécuter ce remplacement dans la méthode Register de WebApi Config:
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);
la source
La solution est simple.
Après la requête LINQ, ajoutez .ToList () (ou ToDictionary si besoin).
Cela fera un chargement impatient que le chargement paresseux des données
la source
IENumerable
et l'ajouter.TiList()
au retour a fonctionné pour moi.** ce bogue se produit lors de l'appel à partir de la requête web api / wcf / ... du côté client, mais comme effet secondaire, vous devrez inclure les relations dépendantes par le mot clé include. **
public CustomerPortalContext() : base("Name=CustomerPortalContext") { base.Configuration.ProxyCreationEnabled = false; }
la source
Si vous travaillez avec EF, en plus d'ajouter le code ci-dessous sur Global.asax
N'oubliez pas d'importer
using System.Data.Entity;
Ensuite, vous pouvez retourner vos propres modèles EF
la source
veuillez consulter la documentation de l'API Web pour ce problème, Gestion des références d'objets circulaires
Cordialement
la source
Si vous utilisez une API Web avec Entity Framework, une solution peut échouer pour sérialiser la réponse dans l'API Web avec Json
Fondamentalement, vous devez créer un modèle correspondant à chaque modèle EF, cela supprime les dépendances entre les classes et permet une sérialisation facile.
Code: (extrait du lien référencé)
Créer un UserModel
public class UserModel { public string FirstName { get; set; } public string LastName { get; set; } }
Changer ma méthode GetAll ()
public IEnumerable<UserModel> GetAll() { using (Database db = new Database ()) { List<UserModel> listOfUsers = new List<UserModel>(); UserModel userModel = new UserModel(); foreach(var user in db.Users) { userModel.FirstName = user.FirstName; userModel.LastName = user.LastName; listOfUsers.Add(userModel); } IEnumerable<UserModel> users = listOfUsers; return users; } }
la source
L'entité par défaut 6 utilise XML pour apis, dans votre projet, recherchez le fichier "Global.asax" File et ajoutez cette ligne:
Cette ligne supprime le formateur XML.
la source
mais si vous avez trouvé ce problème avec d'autres entités / classes, vous devez créer un nouveau DTO pour chaque classe, et si vous en avez beaucoup, vous pouvez trouver un problème, aussi je pense que créer un DTO uniquement pour résoudre ce problème n'est pas la meilleure façon ...
Avez-vous essayé cela?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
Cordialement
la source
hmmm, ce qui suit peut vous aider.
J'obtenais la même exception, et dans mon cas, je passais d'abord l'entité poco réelle créée pour le code d'entité. Depuis, il contient une relation avec d'autres entités, je viens de créer l'entité viewmapper / dto par-dessus pour retourner.
Cela fonctionne bien maintenant.
Entité Poco:
public class Tag { public int Id{get;set;} public string Title{get;set;} public IList<Location> Locations{get;set;} }
ViewMapper / Dto
public class TagResultsViewMapper { public int Id{get;set;} public string Title{get;set;} //just remove the following relationship //public IList<Location> Locations{get;set;} }
la source
Votre question est assez similaire à la mienne. Vous ne devez pas renvoyer directement les données de la base de données. Pour cela, vous devez créer le modèle et associer les données que vous souhaitez afficher.
Dans mon exemple, il y a des données sur User que Json n'a pas pu sérialiser, j'ai créé un userModel et, dans mon API, je renvoie userModel à la place User de la base de données.
La logique de conversion ou d'association de données entre User et UserModel doit être dans l'API.
Échec de la sérialisation de la réponse dans l'API Web avec Json
la source
C'était l'erreur spécifique que je recevais de mon appel à l'API Web odata:
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.
J'ai finalement compris que ma classe dbContext avait un nom de table mal formaté attribué dans onModelCreating .. donc le SqlClient mourait à la recherche d'une table qui n'existait pas dans ma base de données !!
la source