Ich arbeite mit ASP.NET MVC 5 Web Api. Ich möchte alle meine Benutzer konsultieren.
Ich habe geschrieben api/users
und erhalte Folgendes:
"Der Typ 'ObjectContent`1' konnte den Antworttext für den Inhaltstyp 'application / json; charset = utf-8' nicht serialisieren."
In WebApiConfig habe ich bereits folgende Zeilen hinzugefügt:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Aber es funktioniert immer noch nicht.
Meine Funktion für Rückgabedaten lautet:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
c#
asp.net
json
asp.net-web-api
CampDev
quelle
quelle
Antworten:
Wenn es darum geht, Daten von Web Api (oder einem anderen Webdienst) an den Verbraucher zurückzugeben, empfehle ich dringend, Entitäten, die aus einer Datenbank stammen, nicht zurückzugeben. Es ist viel zuverlässiger und wartbarer, Modelle zu verwenden, in denen Sie steuern können, wie die Daten aussehen, und nicht die Datenbank. Auf diese Weise müssen Sie nicht so viel mit den Formatierern in der WebApiConfig herumspielen. Sie können einfach ein UserModel erstellen, das untergeordnete Modelle als Eigenschaften hat, und die Referenzschleifen in den Rückgabeobjekten entfernen. Das macht den Serializer viel glücklicher.
Außerdem müssen Formatierer oder unterstützte Medientypen normalerweise nicht entfernt werden, wenn Sie in der Anforderung nur den Header "Akzeptiert" angeben. Das Herumspielen mit diesem Zeug kann die Dinge manchmal verwirrender machen.
Beispiel:
quelle
Wenn Sie mit EF arbeiten, fügen Sie neben dem folgenden Code auch Global.asax hinzu
Vergessen Sie nicht zu importieren
Dann können Sie Ihre eigenen EF-Modelle zurückgeben
So einfach ist das!
quelle
Die richtige Antwort ist ein Weg, aber es ist ein Overkill, wenn Sie es durch eine Konfigurationseinstellung beheben können.
Besser im dbcontext-Konstruktor verwenden
Asp.Net-Web-API-Fehler: Der Typ 'ObjectContent`1' konnte den Antworttext für den Inhaltstyp 'application / xml nicht serialisieren. Zeichensatz = utf-8 '
quelle
Fügen Sie diesen Code
global.asax
unten hinzuApplication_Start
:Update von
.Ignore
bis.Serialize
. Es muss funktionieren.quelle
quelle
Ich mag diesen Code nicht:
foreach(var user in db.Users)
Als Alternative könnte man so etwas tun, was für mich funktioniert hat:
Am Ende habe ich jedoch die Lösung von Lucas Roselli verwendet.
Update: Vereinfacht durch Rückgabe eines anonymen Objekts:
quelle
Ich habe es mit diesem Code in die Datei WebApiConfig.cs aufgelöst
quelle
Es gibt auch dieses Szenario, das denselben Fehler erzeugt:
Im Falle, dass die Rückgabe eine
List<dynamic>
Web-API-Methode istBeispiel:
Verwenden Sie für dieses Szenario das [KnownTypeAttribute] in der Rückgabeklasse (alle) wie folgt:
Das funktioniert bei mir!
quelle
Addiert man diese in Ihrer
Application_Start()
Methode derGlobal.asax
Datei lösen soll das ProblemMETHODE 2: [Nicht empfohlen]
Wenn Sie mit EntityFramework arbeiten, können Sie den Proxy in Ihrem DbContext-Klassenkonstruktor deaktivieren. HINWEIS: Dieser Code wird entfernt, wenn Sie das Modell aktualisieren
quelle
Mein persönlicher Favorit: Fügen Sie einfach den folgenden Code hinzu
App_Start/WebApiConfig.cs
. Dies gibt standardmäßig json anstelle von XML zurück und verhindert auch den Fehler, den Sie hatten. Keine Notwendigkeit zu bearbeitenGlobal.asax
, um zu entfernenXmlFormatter
usw.quelle
Verwenden Sie AutoMapper ...
quelle
Verwenden Sie den folgenden Namespace:
using System.Web.OData;
Anstatt :
using System.Web.Http.OData;
Es hat bei mir funktioniert
quelle
Fügen Sie die folgende Zeile hinzu
Zwei Möglichkeiten,
ProxyCreationEnabled
als zu verwendenfalse
.Fügen Sie es in
DBContext
Constructor hinzuODER
Fügen Sie die Zeile innerhalb der
Get
Methode hinzuquelle
Lösung, die bei mir funktioniert hat:
Verwenden Sie
[DataContract]
für Klasse und[DataMember]
Attribute für jede zu serialisierende Eigenschaft. Dies reicht aus, um das Json-Ergebnis zu erhalten (z. B. vom Geiger).Um die XML-Serialisierung zu erhalten, schreiben Sie
Global.asax
diesen Code:var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;
quelle
Um die Antwort von jensendp zu ergänzen:
Ich würde die Entität an ein vom Benutzer erstelltes Modell übergeben und die Werte dieser Entität verwenden, um die Werte in Ihrem neu erstellten Modell festzulegen. Beispielsweise:
Ändern Sie dann Ihren Rückgabetyp in:
IEnumerable<UserInformation>
quelle
Ich füge im Grunde eine Zeile hinzu, die sie sind
zu UsersController.cs
quelle
Verwenden Sie [Serializable] für die Klasse:
Beispiel:
Es hat bei mir funktioniert!
quelle
Sie müssen den Serializer-Formatierer in WebApiConfig.cs definieren, der im Ordner App_Start verfügbar ist
Hinzufügen von config.Formatters.Remove (config.Formatters.XmlFormatter); // die Ihnen Daten im JSON-Format liefert
Hinzufügen von config.Formatters.Remove (config.Formatters.JsonFormatter); // die Ihnen Daten im XML-Format liefert
quelle
Ein anderer Fall, in dem ich diesen Fehler erhielt, war, als meine Datenbankabfrage einen Nullwert zurückgab, mein Benutzer- / Ansichtsmodelltyp jedoch als nicht nullwertfähig festgelegt wurde. Zum Beispiel den Wechsel von meinem UserModel Feld
int
zuint?
aufgelöst.quelle
Dies passiert auch, wenn der Antworttyp nicht öffentlich ist! Ich habe eine interne Klasse zurückgegeben, als ich mit Visual Studio den Typ generiert habe.
quelle
Obwohl alle oben genannten Antworten korrekt sind, sollten Sie InnerException> ExceptionMessage überprüfen .
Wenn so etwas wie "Die ObjectContext-Instanz wurde entsorgt und kann nicht mehr für Vorgänge verwendet werden, für die eine Verbindung erforderlich ist. " Dies kann aufgrund des Standardverhaltens der EF ein Problem sein.
Durch Zuweisen von LazyLoadingEnabled = false in Ihrem DbContext-Konstruktor wird der Trick ausgeführt.
Weitere Informationen zum EagerLoading- und LazyLoading-Verhalten von EF finden Sie in diesem MSDN-Artikel .
quelle
In meinem Fall hatte ich eine ähnliche Fehlermeldung:
Aber wenn ich tiefer darin grabe, war das Problem:
Die Art und Weise, wie ich durch Hinzufügen gelöst habe
KnownType
.Dies wurde inspiriert von dieser Antwort gelöst .
Referenz: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx
quelle
Visual Studio 2017 oder 2019 ist diesbezüglich völlig unüberlegt, da Visual Studio selbst die Ausgabe im JSON- Format erfordert , während das Standardformat von Visual Studio " XmlFormat" (config.Formatters.XmlFormatter) ist .
Visual Studio sollte dies automatisch tun, anstatt den Entwicklern so viel Ärger zu bereiten.
Um dieses Problem zu beheben, rufen Sie die Datei WebApiConfig.cs auf und fügen Sie hinzu
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);
nach " config.MapHttpAttributeRoutes (); " in der Register- Methode (HttpConfiguration config) . Dies würde es Ihrem Projekt ermöglichen, eine JSON-Ausgabe zu erzeugen.
quelle
In meinem Fall habe ich die Neuerstellung der Datenbank gelöst. Ich habe einige Änderungen an einem Modell vorgenommen und beim Starten der Update-Datenbank in der Package Manager-Konsole den folgenden Fehler erhalten:
quelle
Falls: Wenn das Hinzufügen von Code zu WebApiConfig.cs oder Global.asax.cs für Sie nicht funktioniert:
Fügen Sie die Funktion .ToList () hinzu.
Ich habe jede Lösung ausprobiert, aber Folgendes hat bei mir funktioniert:
Ich hoffe, es hilft.
quelle
In meinem Fall wurde es behoben, als ich das virtuelle Schlüsselwort vor meinen Navigationseigenschaften entfernte. Ich meine die Referenztabellen. Also habe ich mich verändert
zu:
quelle
Fügen Sie einfach die folgenden Zeilen in global.asax ein:
Importieren
quelle