web-dev-qa-db-fra.com

n'a pas réussi à sérialiser la réponse dans l'API Web

Je travaillais sur l'API Web ASP.NET MVC, j'ai cette erreur:

Le type 'ObjectContent`1' n'a pas pu 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 je reçois cette erreur?

83
Tamal kanti Dey

Pour moi, c'était un problème de référencement circulaire. 

La réponse acceptée ne fonctionnait pas pour moi car elle ne faisait que modifier le comportement du formateur JSON, mais je recevais du XML lorsque j'ai appelé le service à partir du navigateur.

Pour résoudre ce problème, j'ai désactivé XML et forcé le renvoi de JSON. 

Dans le fichier Global.asax, placez les lignes suivantes en haut de votre méthode Application_Start: 

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

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.

117
Zane

dans votre fichier global.asax, dans la méthode Application_start (), ajoutez cette ligne:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

J'espère que ça vous aide!

42

J'ai le même problème. Et je l'ai résolu. Je mets le constructeur par défaut à la classe DTO.

Ex:

public class User
{
    public User()
    {
    }
}

J'espère que ça marche avec vous!

29
taynguyen

Mettez ceci dans le constructeur. J'espère que cela résoudra le problème:

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }
21
Sadjad Khazaie

J'ai trouvé deux solutions à cela. La première et la plus facile à implémenter est de changer n'importe quel IEnumerables, ICollections en un type de liste. 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 la configuration WebApi:

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
16
Ray Suelzer

La solution est simple.

Après la requête LINQ, ajoutez .ToList () (ou ToDictionary si nécessaire).

Il fera un chargement plus rapide qu'un chargement paresseux des données

7
om471987

Si vous travaillez avec EF, en plus d'ajouter le code ci-dessous sur Global.asax

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

N'oubliez pas d'importer 

using System.Data.Entity;

Ensuite, vous pouvez retourner vos propres modèles EF

4
Lucas Roselli

** Ce bogue survient lors de l'appel 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;
        }
4
Mohamed.Abdo

Si vous utilisez une interface Web avec Entity Framework, une solution peut être Impossible de 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 aisée.

Code: (tiré 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;
    }
}
3
Tung Nguyen

veuillez consulter la documentation de l'API Web pour résoudre ce problème, Gestion des références aux objets circulaires

Cordialement

3

hmmm, suivre peut 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é. Puisqu'il contient des relations avec d'autres entités, je viens de créer l'entité viewmapper/dto au-dessus pour la renvoyer. 

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;}
}
1
aamir sajjad

mais si vous rencontrez 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. Je pense aussi que créer un DTO uniquement pour résoudre ce problème n'est pas le meilleur moyen ...

Avez-vous essayé cela?

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.All;

Cordialement

1
Julito Avellaneda

Entity 6 par défaut utilise XML to apis, dans votre projet, recherchez le fichier "Global.asax" Fichier et ajoutez cette ligne:

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

Cette ligne supprime le formateur XML.

1
Roberth Solís

Votre question est assez similaire à la mienne. Vous ne devez pas renvoyer de données directement de la base de données. Pour cela, vous devez créer un modèle et associer les données que vous souhaitez afficher. 

Dans mon exemple, il existe des données sur l'utilisateur que Json n'a pas pu sérialiser. J'ai créé un userModel et, dans mon API, je renvoie userModel à la place utilisateur à partir 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

0
CampDev

C'était l'erreur spécifique que je revenais de mon appel d'ODATA Web API:

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é en cours d'affectation dans onModelCreating .., de sorte que SqlClient mourait en cherchant une table qui n'existe pas dans mon db !!!

0
bkwdesign