85 votes

échec de la sérialisation de la réponse dans l'API Web

Je travaillais sur ASP.NET MVC web API, 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 ; charset=utf-8'.

Mon contrôleur est :

public Employee GetEmployees()
{
    Employee employees = db.Employees.First();
    return employees;
}

pourquoi j'obtiens cette erreur ?

119voto

Zane Points 576

Pour moi, il s'agissait d'un problème de référencement circulaire.

La réponse acceptée n'a pas fonctionné pour moi parce qu'elle ne modifie que le comportement du formateur JSON, mais j'obtenais du XML lorsque j'appelais le service depuis le navigateur.

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

Dans le fichier Global.asax, placez les lignes suivantes au début de votre méthode Application_Start :

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

Maintenant, seuls les résultats JSON seront renvoyés. Si vous avez besoin de résultats XML, vous devrez trouver une autre solution.

43voto

Julito Avellaneda Points 304

Dans votre application_start veuillez mettre cette ligne :

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

J'espère que cela vous aidera !

29voto

taynguyen Points 131

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

Ex :

public class User
{
    public User()
    {
    }
}

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

21voto

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

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }

16voto

Ray Sülzer Points 1040

J'ai trouvé deux solutions à ce problème. La première et la plus facile à mettre en œuvre est de changer tous les IEnumerables, ICollections en un type de liste. L'interface 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 cette surcharge 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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X