Ich habe an der ASP.NET MVC-Web-API gearbeitet und habe folgenden Fehler:
Der Typ 'ObjectContent`1' konnte den Antworttext für den Inhaltstyp 'application / xml nicht serialisieren. Zeichensatz = utf-8 '.
Mein Controller ist:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
Warum bekomme ich diesen Fehler?
c#
serialization
asp.net-web-api
Tamal Kanti Dey
quelle
quelle
InnerException
Eigenschaft der Serialisierungsausnahme, um herauszufinden, was genau dazu geführt hat, dass die Serialisierung fehlgeschlagen ist.Antworten:
Für mich war dies ein Problem mit der Zirkelreferenzierung.
Die akzeptierte Antwort hat bei mir nicht funktioniert, da sie nur das Verhalten des JSON-Formatierers ändert. Ich habe jedoch XML erhalten, als ich den Dienst über den Browser aufgerufen habe.
Um dies zu beheben, habe ich XML ausgeschaltet und nur die Rückgabe von JSON erzwungen.
Fügen Sie in der Datei Global.asax die folgenden Zeilen oben in Ihre Application_Start-Methode ein:
Jetzt werden nur JSON-Ergebnisse zurückgegeben. Wenn Sie XML-Ergebnisse benötigen, müssen Sie eine andere Lösung finden.
quelle
Fügen Sie in Ihrer Datei global.asax in der Methode Application_start () diese Zeile hinzu:
Ich hoffe das hilft dir!
quelle
Global.asax
's hinzugefügtApplication_Start
, aber keine Änderung.Ich habe das gleiche Problem. Und ich habe es gelöst. Ich habe den Standardkonstruktor in die DTO-Klasse eingefügt.
Ex:
Hoffe es funktioniert mit dir!
quelle
Setzen Sie dies in Konstruktor. Hoffe das löst das Problem:
quelle
Ich habe zwei Lösungen dafür gefunden. Die erste und am einfachsten zu implementierende Methode besteht darin, IEnumerables und ICollections in einen Listentyp zu ändern. Die WebAPI kann diese Objekte serialisieren, jedoch keine Schnittstellentypen serialisieren.
Die andere Option besteht darin, den nativen JSON-Serializer nicht zu verwenden und diese Überschreibung in der Register-Methode der WebApi-Konfiguration auszuführen:
quelle
Die Lösung ist einfach.
Fügen Sie nach der LINQ-Abfrage .ToList () (oder bei Bedarf ToDictionary) hinzu.
Das Laden wird eifriger als das langsame Laden der Daten
quelle
IENumerable
und das Hinzufügen.TiList()
zur Rückgabe hat bei mir funktioniert.** Dieser Fehler tritt auf, wenn von der Client-Seite aus die Anforderungs-Web-API / wcf / ... aufgerufen wird. Als Nebeneffekt müssen Sie jedoch abhängige Beziehungen durch das Schlüsselwort include einschließen. ** **.
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
quelle
Bitte überprüfen Sie die Web-API-Dokumentation für dieses Problem, Umgang mit kreisförmigen Objektreferenzen
Grüße
quelle
Wenn Sie die Web-API mit Entity Framework verwenden, kann eine Lösung fehlschlagen, um die Antwort in der Web-API mit Json zu serialisieren
Grundsätzlich müssen Sie ein Modell erstellen, das jedem EF-Modell entspricht. Dadurch werden Abhängigkeiten zwischen Klassen beseitigt und eine einfache Serialisierung ermöglicht.
Code: (entnommen aus dem Link, auf den verwiesen wird)
Erstellen Sie ein UserModel
Ändere meine Methode GetAll ()
quelle
Standardentität 6 verwendet XML , um in Ihrem Projekt die Datei "Global.asax" zu finden und die folgende Zeile hinzuzufügen:
Diese Zeile entfernt den XML-Formatierer.
quelle
Wenn Sie dieses Problem jedoch bei anderen Entitäten / Klassen festgestellt haben, müssen Sie für jede Klasse ein neues DTO erstellen. Wenn Sie viele davon haben, können Sie ein Problem finden. Ich denke auch, dass Sie ein DTO nur zur Lösung dieses Problems erstellen ist nicht der beste Weg ...
Hast du das versucht?
Grüße
quelle
hmmm, Folgendes kann helfen.
Ich habe die gleiche Ausnahme erhalten und in meinem Fall zuerst die eigentliche Poco-Entität übergeben, die für den Entitätscode erstellt wurde. Da es eine Beziehung zu anderen Entitäten enthält, habe ich gerade die viewmapper / dto-Entität darüber erstellt, um zurückzukehren.
Es funktioniert jetzt gut.
Poco Entity:
ViewMapper / Dto
quelle
Ihre Frage ist meiner ziemlich ähnlich. Sie dürfen keine Daten direkt aus der Datenbank zurückgeben. Dazu müssen Sie ein Modell erstellen und Daten zuordnen, die angezeigt werden sollen.
In meinem Beispiel gibt es Daten zu Benutzern, die Json nicht serialisieren konnte. Ich hatte ein Benutzermodell erstellt und in meiner API gebe ich stattdessen Benutzermodell Benutzer aus Datenbank zurück.
Die Logik zum Konvertieren oder Zuordnen von Daten zwischen User und UserModel muss in der API enthalten sein.
Fehler beim Serialisieren der Antwort in der Web-API mit Json
quelle
Dies war der spezifische Fehler, den ich von meinem Odata-Web-API-Aufruf erhalten habe:
Ich fand schließlich heraus, dass meine dbContext-Klasse einen schlecht formatierten Tabellennamen hatte , der in onModelCreating zugewiesen wurde. Also starb der SqlClient auf der Suche nach einer Tabelle, die in meiner Datenbank nicht vorhanden war !!
quelle