it-swarm.com.de

die Antwort in der Web-API konnte nicht serialisiert werden

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?

83
Tamal kanti Dey

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.

117
Zane

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!

42

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!

29
taynguyen

Setzen Sie dies in den Konstruktor. Hoffe das löst das Problem:

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }
21
Sadjad Khazaie

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);
16
Ray Suelzer

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

7
om471987

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

4
Lucas Roselli

** 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;
        }
4
Mohamed.Abdo

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;
    }
}
3
Tung Nguyen

bitte überprüfen Sie die Web-API-Dokumentation für dieses Problem. Umgang mit kreisförmigen Objektreferenzen

Grüße

3

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;}
}
1
aamir sajjad

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

1

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.

1
Roberth Solís

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

0
CampDev

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 !!

0
bkwdesign