Ich habe an ASP.NET MVC-Web-API gearbeitet. Ich habe diesen Fehler:
Der Typ 'ObjectContent`1' konnte den Antworttext für 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?
Für mich war dies ein Problem mit der Zirkelreferenzierung.
Die akzeptierte Antwort funktionierte nicht für mich, da sich dadurch nur das Verhalten des JSON-Formatierers ändert. Ich erhielt jedoch XML, als ich den Dienst vom Browser aus anrief.
Um dies zu beheben, habe ich XML deaktiviert und nur JSON zurückgegeben.
Fügen Sie in der Datei "Global.asax" die folgenden Zeilen oben in Ihre Application_Start-Methode ein:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Jetzt werden nur JSON-Ergebnisse zurückgegeben. Wenn Sie XML-Ergebnisse benötigen, müssen Sie eine andere Lösung finden.
fügen Sie in Ihrer global.asax-Datei in der Application_start () - Methode folgende Zeile hinzu:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Ich hoffe das hilft dir!
Ich habe das gleiche Problem. Und ich habe es gelöst. Ich setze den Standardkonstruktor in die DTO-Klasse.
Ex:
public class User
{
public User()
{
}
}
Ich hoffe es funktioniert mit dir!
Setzen Sie dies in den Konstruktor. Hoffe das löst das Problem:
public MyController()
{
db.Configuration.ProxyCreationEnabled = false;
}
Ich habe zwei Lösungen gefunden. Die erste und einfachste Implementierung ist das Ändern von IEnumerables, ICollections in einen Listentyp. Die WebAPI kann diese Objekte serialisieren, jedoch keine Schnittstellentypen.
public class Store
{
[StringLength(5)]
public string Zip5 { get; set; }
public virtual List<StoreReport> StoreReports { get; set; } //use a list here
}
Die andere Option ist, den nativen JSON-Serialisierer nicht zu verwenden und diese Überschreibung in der Register-Methode der WebApi-Konfiguration auszuführen:
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
Die Lösung ist einfach.
Fügen Sie nach der LINQ-Abfrage .ToList () (oder ToDictionary bei Bedarf) hinzu.
Es wird ein eifrigeres Laden als ein faules Laden der Daten sein
Wenn Sie mit EF arbeiten, müssen Sie zusätzlich den folgenden Code auf Global.asax hinzufügen
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Vergessen Sie nicht zu importieren
using System.Data.Entity;
Dann können Sie Ihre eigenen EF-Modelle zurückgeben
** Dieser Fehler tritt auf, wenn vom Client aus die Anfrage web api/wcf/... aufgerufen wird. Als Nebeneffekt müssen Sie jedoch die abhängigen Beziehungen durch das Include-Schlüsselwort ..__ einschließen.
public CustomerPortalContext()
: base("Name=CustomerPortalContext")
{
base.Configuration.ProxyCreationEnabled = false;
}
Wenn Sie Web-API mit Entity Framework verwenden, kann eine Lösung verwendet werden Fehler beim Serialisieren der Antwort in der Web-API mit Json
Grundsätzlich müssen Sie ein Modell erstellen, das jedem EF-Modell entspricht. Dadurch werden Abhängigkeiten zwischen Klassen entfernt und eine einfache Serialisierung ermöglicht.
Code: (aus dem referenzierten Link entnommen)
Erstellen Sie ein UserModel
public class UserModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Ändern Sie meine Methode GetAll ()
public IEnumerable<UserModel> GetAll()
{
using (Database db = new Database ())
{
List<UserModel> listOfUsers = new List<UserModel>();
UserModel userModel = new UserModel();
foreach(var user in db.Users)
{
userModel.FirstName = user.FirstName;
userModel.LastName = user.LastName;
listOfUsers.Add(userModel);
}
IEnumerable<UserModel> users = listOfUsers;
return users;
}
}
bitte überprüfen Sie die Web-API-Dokumentation für dieses Problem. Umgang mit kreisförmigen Objektreferenzen
Grüße
hmmm, Folgendes kann helfen.
Ich bekam dieselbe Ausnahme und in meinem Fall habe ich zuerst die eigentliche Poco-Entität übergeben, die für Entitätscode erstellt wurde. Da es Beziehungen 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:
public class Tag
{
public int Id{get;set;}
public string Title{get;set;}
public IList<Location> Locations{get;set;}
}
ViewMapper/Dto
public class TagResultsViewMapper
{
public int Id{get;set;}
public string Title{get;set;}
//just remove the following relationship
//public IList<Location> Locations{get;set;}
}
wenn Sie dieses Problem jedoch bei anderen Entitäten/Klassen gefunden haben, müssen Sie für jede Klasse ein neues DTO erstellen. Wenn Sie viele davon haben, können Sie ein Problem finden. Außerdem denke ich, dass ein DTO nur für die Lösung dieses Problems erstellt wird ist nicht der beste Weg ...
Hast du das probiert?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;
Grüße
Default Entity 6 verwendet XML für Apis. Suchen Sie in Ihrem Projekt die Datei "Global.asax" File und fügen Sie diese Zeile hinzu:
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Diese Zeile entfernt den XML-Formatter.
Deine Frage ist meiner sehr ähnlich. Sie dürfen keine Daten direkt aus der Datenbank zurückgeben. Dazu müssen Sie ein Modell erstellen und die anzuzeigenden Daten zuordnen.
In meinem Beispiel gibt es Daten zu User, die Json nicht serialisieren konnte. Ich hatte ein UserModel erstellt und in meiner API gebe ich UserModel statt User aus der Datenbank zurück.
Die Logik zum Konvertieren oder Verknüpfen von Daten zwischen User und UserModel muss in der API sein.
Fehler beim Serialisieren der Antwort in der Web-API mit Json
Dies war der spezifische Fehler, den ich von meinem Aufruf der odata-Web-API erhielt:
The 'ObjectContent`1' type failed to serialize the response
body for content type 'application/json; odata.metadata=minimal'.
Ich fand schließlich heraus, dass meine dbContext-Klasse einen schlecht formatierten Tabellennamen hatte, der in onModelCreating zugewiesen wurde. Der SqlClient war also auf der Suche nach einer Tabelle, die in meiner Datenbank nicht vorhanden war !!