Pracowałem na internetowym API ASP.NET MVC, mam ten błąd:
Typowi „ObjectContent” 1 nie udało się serializować treści odpowiedzi dla typu zawartości „application / xml”; charset = utf-8 '.
Mój kontroler to:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
dlaczego otrzymuję ten błąd?
c#
serialization
asp.net-web-api
Tamal kanti Dey
źródło
źródło
InnerException
właściwość wyjątku serializacji, aby dowiedzieć się, co dokładnie spowodowało niepowodzenie serializacji.Odpowiedzi:
Dla mnie był to problem z odniesieniami cyklicznymi.
Zaakceptowana odpowiedź nie zadziałała, ponieważ zmieniała tylko zachowanie programu formatującego JSON, ale otrzymywałem XML, gdy dzwoniłem do usługi z przeglądarki.
Aby to naprawić, wyłączyłem XML i wymusiłem zwracanie tylko JSON.
W pliku Global.asax umieść następujące wiersze u góry metody Application_Start:
Teraz zostaną zwrócone tylko wyniki JSON. Jeśli potrzebujesz wyników XML, musisz znaleźć inne rozwiązanie.
źródło
w pliku global.asax, w metodzie Application_start () dodaj następujący wiersz:
Mam nadzieję, że ci to pomoże!
źródło
Global.asax
„sApplication_Start
, ale bez zmian.Mam ten sam problem. I rozwiązałem to. Domyślnego konstruktora umieściłem w klasie DTO.
Dawny:
public class User { public User() { } }
Mam nadzieję, że to zadziała!
źródło
Umieść to w konstruktorze. Mam nadzieję, że to rozwiąże problem:
public MyController() { db.Configuration.ProxyCreationEnabled = false; }
źródło
Znalazłem dwa rozwiązania tego problemu. Pierwszym i najłatwiejszym do zaimplementowania jest zmiana dowolnego IEnumerables, ICollections na typ List. Interfejs WebAPI może serializować te obiekty, ale nie może serializować typów interfejsów.
public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here }
Inną opcją jest nieużywanie natywnego serializatora JSON i uruchomienie tego zastąpienia w metodzie Register w WebApi Config:
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);
źródło
Rozwiązanie jest proste.
Po zapytaniu LINQ dodaj .ToList () (lub ToDictionary w razie potrzeby).
Będzie ładować chętniej niż leniwie ładowanie danych
źródło
IENumerable
i dodanie.TiList()
do zwrotu zadziałało.** ten błąd występuje podczas wywoływania z żądania internetowego interfejsu API / wcf / ... ze strony klienta, ale jako efekt uboczny, będziesz musiał dołączyć zależne relacje przez słowo kluczowe include. **
public CustomerPortalContext() : base("Name=CustomerPortalContext") { base.Configuration.ProxyCreationEnabled = false; }
źródło
Jeśli pracujesz z EF, oprócz dodania poniższego kodu na Global.asax
Nie zapomnij zaimportować
using System.Data.Entity;
Następnie możesz zwrócić własne modele EF
źródło
Sprawdź dokumentację interfejsu API sieci Web dla tego problemu, Obsługa odwołań do obiektów cyklicznych
pozdrowienia
źródło
Jeśli używasz interfejsu API sieci Web z Entity Framework, rozwiązanie może zakończyć się niepowodzeniem serializacji odpowiedzi w interfejsie API sieci Web z Json
Zasadniczo musisz utworzyć model odpowiadający każdemu modelowi EF, usuwa to zależności między klasami i umożliwia łatwą serializację.
Kod: (pobrany z odnośnika)
Utwórz model użytkownika
public class UserModel { public string FirstName { get; set; } public string LastName { get; set; } }
Zmień moją metodę 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; } }
źródło
Domyślna jednostka 6 używa XML do apis, w swoim projekcie znajdź plik „Global.asax” File i dodaj ten wiersz:
Ta linia usuwa XML Formatter.
źródło
ale jeśli znalazłeś ten problem z innymi bytami / klasami, musisz stworzyć nowe DTO dla każdej klasy, a jeśli masz ich dużo, możesz znaleźć problem, również myślę, że tworzymy DTO tylko do rozwiązania tego problemu nie jest najlepszym sposobem ...
Próbowałeś tego?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
pozdrowienia
źródło
hmmm, Poniższe mogą pomóc.
Otrzymałem ten sam wyjątek, aw moim przypadku najpierw przekazywałem rzeczywistą jednostkę poco utworzoną dla kodu jednostki. Ponieważ zawiera on relacje z innymi bytami, właśnie utworzyłem na nim byty viewmapper / dto, aby powracały.
Teraz działa dobrze.
Podmiot Poco:
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;} }
źródło
Twoje pytanie jest dość podobne do mojego. Nie możesz zwracać danych bezpośrednio z bazy danych. W tym celu musisz utworzyć Model i skojarzyć dane, które chcesz pokazać.
W moim przykładzie są dane o użytkowniku, których Json nie mógł serializować, utworzyłem userModel iw moim API zwracam userModel zamiast User z bazy danych.
Logika konwertowania lub kojarzenia danych między użytkownikiem a modelem użytkownika musi znajdować się w interfejsie API.
Nie udało się serializować odpowiedzi w internetowym interfejsie API za pomocą Json
źródło
To był konkretny błąd, który otrzymałem z mojego wywołania internetowego interfejsu API odata:
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.
W końcu zorientowałem się, że moja klasa dbContext miała źle sformatowaną nazwę tabeli, która została przypisana w onModelCreating .. więc SqlClient umierał, szukając tabeli, której nie było w mojej bazie danych !!
źródło