Je travaille avec ASP.NET MVC 5 Web Api. Je souhaite consulter tous mes utilisateurs.
J'ai écrit api/users
et je reçois ceci:
"Le type 'ObjectContent`1' n'a pas réussi à sérialiser le corps de la réponse pour le type de contenu 'application / json; charset = utf-8'"
Dans WebApiConfig, j'ai déjà ajouté ces lignes:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Mais ça ne marche toujours pas.
Ma fonction pour les données de retour est la suivante:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
c#
asp.net
json
asp.net-web-api
CampDev
la source
la source
Réponses:
Quand il s'agit de renvoyer des données au consommateur à partir de Web Api (ou de tout autre service Web d'ailleurs), je recommande vivement de ne pas renvoyer les entités qui proviennent d'une base de données. Il est beaucoup plus fiable et maintenable d'utiliser des modèles dans lesquels vous avez le contrôle de l'apparence des données et non de la base de données. De cette façon, vous n'avez pas à vous soucier autant des formateurs dans WebApiConfig. Vous pouvez simplement créer un UserModel qui a des modèles enfants comme propriétés et vous débarrasser des boucles de référence dans les objets de retour. Cela rend le sérialiseur beaucoup plus heureux.
En outre, il n'est généralement pas nécessaire de supprimer les formateurs ou les types de supports pris en charge si vous spécifiez simplement l'en-tête «Accepte» dans la demande. Jouer avec ce genre de choses peut parfois rendre les choses plus confuses.
Exemple:
la source
Si vous travaillez avec EF, en plus d'ajouter le code ci-dessous sur Global.asax
N'oubliez pas d'importer
Ensuite, vous pouvez retourner vos propres modèles EF
Aussi simple que cela!
la source
Une bonne réponse est une voie à suivre, mais il est exagéré de pouvoir le corriger avec un seul paramètre de configuration.
Mieux vaut l'utiliser dans le constructeur dbcontext
Erreur de l'API Web Asp.Net: 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 '
la source
Ajoutez ce code
global.asax
ci-dessous surApplication_Start
:Mettre à jour de
.Ignore
à.Serialize
. Cela doit marcher.la source
la source
Je n'aime pas ce code:
foreach(var user in db.Users)
Comme alternative, on pourrait faire quelque chose comme ça, qui a fonctionné pour moi:
Cependant, j'ai fini par utiliser la solution de Lucas Roselli.
Mise à jour: simplifiée en renvoyant un objet anonyme:
la source
Je l'ai résolu en utilisant ce code dans le fichier WebApiConfig.cs
la source
Il y a aussi ce scénario qui génère la même erreur:
Si le retour est une
List<dynamic>
méthode de l'API WebExemple:
Donc, pour ce scénario, utilisez le [KnownTypeAttribute] dans la classe de retour (tous) comme ceci:
Cela fonctionne pour moi!
la source
L'ajout de ceci dans votre
Application_Start()
méthode deGlobal.asax
fichier devrait résoudre le problèmeMÉTHODE 2: [Non recommandé]
Si vous travaillez avec EntityFramework, vous pouvez désactiver le proxy dans votre constructeur de classe DbContext. REMARQUE: ce code sera supprimé si vous mettez à jour le modèle
la source
Mon préféré: ajoutez simplement le code ci-dessous à
App_Start/WebApiConfig.cs
. Cela renverra json au lieu de XML par défaut et empêchera également l'erreur que vous avez eue. Pas besoin de modifierGlobal.asax
pour supprimer,XmlFormatter
etc.la source
Utiliser AutoMapper ...
la source
Utilisez l'espace de noms suivant:
using System.Web.OData;
Au lieu de :
using System.Web.Http.OData;
Ça a marché pour moi
la source
Ajoutez la ligne ci-dessous
Deux façons d'utiliser
ProxyCreationEnabled
commefalse
.Ajoutez-le à l'intérieur du
DBContext
constructeurOU
Ajoutez la ligne à l'intérieur de la
Get
méthodela source
Solution qui a fonctionné pour moi:
À utiliser
[DataContract]
pour la classe et les[DataMember]
attributs de chaque propriété à sérialiser. C'est suffisant pour obtenir le résultat Json (par exemple à partir de Fiddler).Pour obtenir la sérialisation xml, écrivez
Global.asax
ce code:var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;
la source
Pour ajouter à la réponse de jensendp:
Je passerais l'entité à un modèle créé par l'utilisateur et utiliserais les valeurs de cette entité pour définir les valeurs dans votre modèle nouvellement créé. Par exemple:
Puis changez votre type de retour en:
IEnumerable<UserInformation>
la source
J'ajoute essentiellement une ligne dont ils sont
à UsersController.cs
la source
Utilisez [Serializable] pour la classe:
Exemple:
Cela a fonctionné pour moi!
la source
Vous devrez définir Serializer Formatter dans WebApiConfig.cs disponible dans App_Start Folder comme
Ajout de config.Formatters.Remove (config.Formatters.XmlFormatter); // qui vous fournira des données au format JSON
Ajout de config.Formatters.Remove (config.Formatters.JsonFormatter); // qui vous fournira des données au format XML
la source
Mettez simplement les lignes suivantes dans global.asax:
Importer
la source
Un autre cas où j'ai reçu cette erreur était lorsque ma requête de base de données a renvoyé une valeur nulle mais que mon type de modèle utilisateur / vue a été défini comme non nullable. Par exemple, changer mon champ UserModel de
int
àint?
résolu.la source
Cela se produit également lorsque le type de réponse n'est pas public! J'ai renvoyé une classe interne car j'ai utilisé Visual Studio pour me générer le type.
la source
Bien que toutes ces réponses ci-dessus soient correctes, on peut vouloir vérifier InnerException> ExceptionMessage .
S'il indique quelque chose comme ceci " L'instance ObjectContext a été supprimée et ne peut plus être utilisée pour les opérations qui nécessitent une connexion. ". Cela peut être un problème en raison du comportement par défaut de l'EF.
En attribuant LazyLoadingEnabled = false dans votre constructeur DbContext fera l'affaire.
Pour une lecture plus détaillée sur le comportement EagerLoading et LazyLoading d'EF, reportez-vous à cet article MSDN .
la source
Dans mon cas, j'ai eu un message d'erreur similaire:
Mais quand j'y ai creusé plus profondément, le problème était:
La façon dont j'ai résolu en ajoutant
KnownType
.Cela a été résolu en s'inspirant de cette réponse .
Référence: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx
la source
Visual Studio 2017 ou 2019 est totalement irréfléchi à ce sujet, car Visual Studio lui-même nécessite que la sortie soit au format json , tandis que le format par défaut de Visual Studio est « XmlFormat» (config.Formatters.XmlFormatter) .
Visual Studio devrait le faire automatiquement au lieu de donner autant de problèmes aux développeurs.
Pour corriger ce problème, accédez au fichier WebApiConfig.cs et ajoutez
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);
après " config.MapHttpAttributeRoutes (); " dans la méthode Register (HttpConfiguration config) . Cela permettrait à votre projet de produire une sortie json.
la source
Dans mon cas, j'ai résolu la recréation de la base de données. J'ai apporté des modifications à un modèle et en lançant Update-Database dans la console du gestionnaire de packages, j'ai eu l'erreur suivante:
la source
Au cas où: Si l'ajout de code à WebApiConfig.cs ou Global.asax.cs ne fonctionne pas pour vous:
Ajoutez la fonction .ToList ().
J'ai essayé toutes les solutions, mais la suite a fonctionné pour moi:
J'espère que ça aide.
la source
dans mon cas, il a été corrigé lorsque j'ai supprimé le mot clé virtuel avant mes propriétés de navigation, je veux dire les tables de référence. alors j'ai changé
à:
la source