Pas réussi à sérialiser la réponse de l'API Web avec Json
Je suis en train de travailler avec ASP.NET MVC 5 de l'Api Web. Je veux consulter tous mes utilisateurs.
J'ai écrit api/users
et je reçois ceci:
"Le" ObjectContent`1' type échoué à sérialiser le corps de la réponse pour le type de contenu application/json; charset=utf-8'"
Dans WebApiConfig, déjà j'ai ajouté ces lignes:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Mais cela ne fonctionne toujours pas.
Ma fonction pour renvoyer des données est: est-ce
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
- Quelle est la valeur de l'objet ressembler que vous essayez de transmettre au consommateur?
- Merci beaucoup! Juste fyi - je pense que cela devrait lire: à l'aide de données (Base de données db = new Database ()) { List<UserModel> listOfUsers = new List<UserModel>(); foreach(var utilisateur en db.Les utilisateurs) { UserModel userModel = new UserModel(); userModel.FirstName = utilisateur.Prénom; userModel.LastName = utilisateur.Nom; listOfUsers.Ajouter(userModel); } IEnumerable<UserModel> utilisateurs = listOfUsers; le retour des utilisateurs; } ..comme les résultats étaient tous de retour les mêmes valeurs.
- Double Possible de impossible de sérialiser la réponse de l'API Web
Vous devez vous connecter pour publier un commentaire.
Quand il s'agit de données de retour en arrière pour le consommateur à partir de l'Api Web (ou de tout autre service web, d'ailleurs), je recommande fortement de ne pas passer à l'arrière des entités qui viennent d'une base de données. Il est beaucoup plus fiable et maintenable à l'utilisation des Modèles dans lesquels vous avez le contrôle de ce que l'apparence des données et de la base de données. De cette façon, vous n'avez pas à s'amuser avec les formateurs tellement dans le WebApiConfig. Il vous suffit de créer un UserModel qui a des Modèles enfants comme des propriétés et de se débarrasser des boucles de référence dans le retour des objets. Qui rend le processus beaucoup plus heureux.
Aussi, il n'est pas nécessaire de supprimer des formateurs ou des médias supportés en règle générale, si vous êtes juste de préciser le "Accepte" en-tête de la demande. Jouer avec ce genre de choses peut parfois rendre les choses plus confuses.
Exemple:
Si vous travaillez avec EF, en plus d'ajouter le code ci-dessous sur le Global.asax
Ne pas oublier d'importer
Ensuite, vous pouvez revenir à votre propre EF Modèles
Simple que cela!
Donné le droit de réponse est une façon d'aller, cependant, il est exagéré quand vous pouvez résoudre le problème par un paramètre de configuration.
Préférable de l'utiliser dans le constructeur dbcontext
Asp.Net l'API Web de l'Erreur: Le "ObjectContent`1' type échoué à sérialiser le corps de la réponse pour le type de contenu application/xml; charset=utf-8'
Ajouter ce code à
global.asax
ci-dessous surApplication_Start
:Mise à jour de
.Ignore
à.Serialize
. Il doit travailler.Je n'aime pas ce code:
foreach(var user in db.Users)
Comme une alternative, on pourrait faire quelque chose comme ce qui a fonctionné pour moi:
Cependant, j'ai fini à l'aide de Lucas Roselli la solution.
Mise à jour: Simplifié par renvoi d'un objet anonyme:
Je l'ai résolu en utilisant ce code pour WebApiConfig.cs fichier
Il y a aussi ce scénario qui génèrent la même erreur:
En cas de retour à une
List<dynamic>
à l'api web méthodeExemple:
Donc, pour ce scénario, utilisez la touche [KnownTypeAttribute] dans la déclaration de la classe (tous) comme ceci:
Cela fonctionne pour moi!
Ajouter ceci dans votre
Application_Start()
méthode deGlobal.asax
fichier devrait résoudre le problèmeMÉTHODE 2: [n'est Pas recommandé]
Si vous travaillez avec EntityFramework, vous pouvez désactiver le proxy dans votre DbContext constructeur de la classe. REMARQUE: ce code wll être éliminées si vous mettez à jour le modèle
Mon favori personnel: il suffit d'ajouter le code ci-dessous pour
App_Start/WebApiConfig.cs
. Ce sera de retour json au lieu de XML par défaut et aussi éviter l'erreur que vous aviez. Pas besoin d'éditerGlobal.asax
pour supprimerXmlFormatter
etc.Utilisation AutoMapper...
Utiliser l'espace de noms suivant:
using System.Web.OData;
Au lieu de :
using System.Web.Http.OData;
Il a travaillé pour moi
Solution qui a fonctionné pour moi:
Utilisez [DataContract] pour la classe et [DataMember] attributs pour chaque propriété à sérialiser.C'est assez pour obtenir des résultat Json (par ex. de fiddler).
Pour obtenir la sérialisation xml écrire Mondiale.asax ce code:
var xml = GlobalConfiguration.La Configuration.Des formateurs.XmlFormatter;
xml.UseXmlSerializer = true;
https://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization
À ajouter à jensendp réponse:
J'aimerais passer de l'entité pour un utilisateur a créé un modèle et d'utiliser les valeurs de l'entité pour définir les valeurs de votre modèle nouvellement créé. Par exemple:
Puis changez le type de retour:
IEnumerable<UserInformation>
En gros, j'ai ajouter une ligne qui ils sont
à UsersController.cs
Vous devrez définir Sérialiseur Formateur au sein de WebApiConfig.cs disponible dans App_Start Dossier comme
L'ajout de config.Des formateurs.Supprimer(config.Des formateurs.XmlFormatter);
//qui fournit les données au Format JSON
L'ajout de config.Des formateurs.Supprimer(config.Des formateurs.JsonFormatter);
//qui fournit des données au Format XML
Un autre cas où j'ai reçu cette erreur a été lors de ma base de données requête a retourné une valeur nulle, mais mon user/view type de modèle a été défini comme non nullable. Par exemple, en changeant mon UserModel champ de
int
àint?
résolu.Cela se produit également lorsque la Réponse-Type n'est pas public!
Je suis retourné une classe interne que j'ai utilisé Visual Studio pour générer moi le type.
Alors que toutes les réponses ci-dessus sont correctes, on peut vouloir vérifier la InnerException > ExceptionMessage.
Si elle dit quelque chose comme ce "Til ObjectContext instance a été éliminé et ne peut plus être utilisé pour les opérations qui nécessitent une connexion.". Cela pourrait être un problème en raison du comportement par défaut de l'EF.
Par l'affectation de LazyLoadingEnabled = false dans votre DbContext constructeur fera l'affaire.
Pour plus de lecture détaillée sur EagerLoading et LazyLoading comportement de EF renvoyer cette Article MSDN.
Dans mon cas, j'ai eu le même message d'erreur:
Mais quand je creuse plus profondément en elle, la question était:
La façon dont je l'ai résolu en ajoutant
KnownType
.Cela a été résolu inspiré de ce réponse.
Référence: https://msdn.microsoft.com/en-us/library/ms730167(v=vs. 100).aspx
Visual Studio 2017 ou 2019 est totalement irréfléchis sur ce point, car Visual Studio lui-même nécessite de la sortie en json format, tandis que Visual Studio est le format par défaut est "XmlFormat" (config.Des formateurs.XmlFormatter).
Visual Studio doit s'effectuer automatiquement, au lieu de donner des développeurs de beaucoup de problèmes.
Pour corriger ce problème, passez à la WebApiConfig.cs fichier, et ajouter
var json = config.Des formateurs.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objets;
config.Des formateurs.Supprimer(config.Des formateurs.XmlFormatter);
après "config.MapHttpAttributeRoutes();" dans le Registre(HttpConfiguration config) méthode. Cela permettra à votre projet afin de produire une sortie json.
Dans mon cas, j'ai résolu de recréer la base de données.
J'ai apporté quelques modifications à un modèle et le lancement de la mise à Jour de la Base de données dans le Gestionnaire de paquets de la Console, j'ai obtenu l'Erreur suivante:
Dans les cas suivants: Si l'ajout de code pour WebApiConfig.cs ou Mondiale.asax.cs ne fonctionne pas pour vous:
Ajouter .ToList() fonction.
J'ai essayé toutes les solutions, mais à la suite fonctionné pour moi:
J'espère, ça aide.
Ajouter la ligne ci-dessous
Deux façon d'utiliser
ProxyCreationEnabled
commefalse
.L'ajouter à l'intérieur de
DBContext
ConstructeurOU
Ajouter la ligne à l'intérieur de
Get
méthodeUtilisez [Serializable] pour la classe:
Exemple:
Il a travaillé pour moi!