Pracuję z ASP.NET MVC 5 Web Api. Chcę skonsultować się ze wszystkimi moimi użytkownikami.
Napisałem api/users
i otrzymuję to:
„Nie udało się serializować treści odpowiedzi dla typu„ ObjectContent ”1 dla typu zawartości„ application / json; charset = utf-8 ”.
W WebApiConfig dodałem już te linie:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Ale to nadal nie działa.
Moja funkcja zwracania danych jest następująca:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
c#
asp.net
json
asp.net-web-api
CampDev
źródło
źródło
Odpowiedzi:
Jeśli chodzi o zwracanie danych z powrotem do konsumenta z Web Api (lub jakiejkolwiek innej usługi sieciowej w tym zakresie), zdecydowanie odradzam przekazywanie podmiotów pochodzących z bazy danych. O wiele bardziej niezawodne i łatwiejsze w utrzymaniu jest używanie modeli, w których masz kontrolę nad wyglądem danych, a nie bazy danych. W ten sposób nie musisz zbytnio bawić się elementami formatującymi w WebApiConfig. Możesz po prostu utworzyć model użytkownika, który ma modele potomne jako właściwości i pozbyć się pętli odwołań w zwracanych obiektach. To sprawia, że serializator jest znacznie szczęśliwszy.
Ponadto nie ma potrzeby usuwania elementów formatujących lub obsługiwanych typów multimediów, zazwyczaj jeśli w żądaniu określasz tylko nagłówek „Accepts”. Zabawa z tymi rzeczami może czasami sprawić, że sytuacja będzie bardziej zagmatwana.
Przykład:
źródło
Jeśli pracujesz z EF, oprócz dodania poniższego kodu na Global.asax
Nie zapomnij zaimportować
Następnie możesz zwrócić własne modele EF
Proste!
źródło
Podana prawidłowa odpowiedź jest jednym ze sposobów, jednak jest to przesada, gdy można to naprawić za pomocą jednego ustawienia konfiguracji.
Lepiej użyć go w konstruktorze dbcontext
Błąd interfejsu API sieci Web Asp.Net: dla typu „ObjectContent” 1 nie można serializować treści odpowiedzi dla typu zawartości „application / xml”; charset = utf-8 '
źródło
Dodaj ten kod
global.asax
poniżej wApplication_Start
:Aktualizuj z
.Ignore
do.Serialize
. To musi działać.źródło
źródło
Nie podoba mi się ten kod:
foreach(var user in db.Users)
Alternatywnie można zrobić coś takiego, co u mnie zadziałało:
Skończyło się jednak na rozwiązaniu Lucasa Rosellego.
Aktualizacja: Uproszczone przez zwrócenie anonimowego obiektu:
źródło
Rozwiązałem to używając tego kodu do pliku WebApiConfig.cs
źródło
Istnieje również ten scenariusz, który generuje ten sam błąd:
W przypadku, gdy powrót jest
List<dynamic>
metodą api sieci webPrzykład:
Dlatego w tym scenariuszu użyj [KnownTypeAttribute] w klasie zwracanej (wszystkich) w następujący sposób:
To działa dla mnie!
źródło
Dodanie tego do
Application_Start()
metodyGlobal.asax
pliku powinno rozwiązać problemMETODA 2: [Niezalecane]
Jeśli pracujesz z EntityFramework, możesz wyłączyć serwer proxy w konstruktorze klasy DbContext. UWAGA: ten kod zostanie usunięty, jeśli zaktualizujesz model
źródło
Mój osobisty ulubiony: po prostu dodaj poniższy kod do
App_Start/WebApiConfig.cs
. Spowoduje to domyślnie zwrócenie pliku json zamiast XML, a także zapobiegnie wystąpieniu błędu. Nie ma potrzeby edycji,Global.asax
aby usunąćXmlFormatter
itp.źródło
Użyj AutoMapper ...
źródło
Użyj następującej przestrzeni nazw:
using System.Web.OData;
Zamiast :
using System.Web.Http.OData;
U mnie to zadziałało
źródło
Dodaj poniższą linię
Dwa sposoby użycia
ProxyCreationEnabled
jakofalse
.Dodaj go do
DBContext
ConstructorLUB
Dodaj linię wewnątrz
Get
metodyźródło
Rozwiązanie, które zadziałało dla mnie:
Użyj
[DataContract]
dla klasy i[DataMember]
atrybutów dla każdej właściwości do serializacji. To wystarczy, aby otrzymać wynik Json (np. Ze skrzypka).Aby uzyskać serializację XML, napisz w
Global.asax
tym kodzie:var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;
źródło
Aby dodać do odpowiedzi Jensendpa:
Przekazałbym jednostkę do modelu utworzonego przez użytkownika i użyłbym wartości z tej jednostki, aby ustawić wartości w nowo utworzonym modelu. Na przykład:
Następnie zmień typ zwrotu na:
IEnumerable<UserInformation>
źródło
Zasadniczo dodaję jedną linię, którą są
do UsersController.cs
źródło
Użyj [Serializable] dla klasy:
Przykład:
U mnie zadziałało!
źródło
Będziesz musiał zdefiniować Serializer Formatter w WebApiConfig.cs dostępnym w folderze App_Start, takim jak
Dodawanie config.Formatters.Remove (config.Formatters.XmlFormatter); // który dostarczy Ci dane w formacie JSON
Dodanie config.Formatters.Remove (config.Formatters.JsonFormatter); // który dostarczy Ci dane w formacie XML
źródło
Po prostu umieść następujące wiersze w global.asax:
Import
źródło
Innym przypadkiem, w którym otrzymałem ten błąd, było to, że moje zapytanie do bazy danych zwróciło wartość null, ale mój typ modelu użytkownika / widoku został ustawiony jako niepodlegający wartości null. Na przykład zmiana mojego pola UserModel z
int
naint?
rozwiązane.źródło
Dzieje się tak również, gdy typ odpowiedzi nie jest publiczny! Zwróciłem klasę wewnętrzną, ponieważ użyłem programu Visual Studio do wygenerowania typu.
źródło
Chociaż wszystkie powyższe odpowiedzi są poprawne, warto sprawdzić InnerException> ExceptionMessage .
Jeśli mówi coś takiego: „Instancja ObjectContext została usunięta i nie może być już używana do operacji wymagających połączenia. ”. Może to być problem z powodu domyślnego zachowania EF.
Przypisanie LazyLoadingEnabled = false w konstruktorze DbContext załatwi sprawę.
Aby uzyskać bardziej szczegółowe informacje na temat zachowania EF w trybie EagerLoading i LazyLoading, zapoznaj się z tym artykułem w witrynie MSDN .
źródło
W moim przypadku miałem podobny komunikat o błędzie:
Ale kiedy głębiej się w to zagłębiłem, problem był następujący:
Sposób, w jaki rozwiązałem, dodając
KnownType
.Zostało to rozwiązane zainspirowane tą odpowiedzią .
Źródła: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx
źródło
Program Visual Studio 2017 lub 2019 jest w tej kwestii całkowicie bezmyślny, ponieważ sam program Visual Studio wymaga, aby dane wyjściowe były w formacie json , podczas gdy domyślnym formatem programu Visual Studio jest „ XmlFormat” (config.Formatters.XmlFormatter) .
Visual Studio powinno robić to automatycznie, zamiast sprawiać programistom tyle problemów.
Aby rozwiązać ten problem, przejdź do pliku WebApiConfig.cs i dodaj
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);
po „ config.MapHttpAttributeRoutes (); ” w metodzie Register (HttpConfiguration config) . Umożliwiłoby to projektowi wygenerowanie danych wyjściowych json.
źródło
W moim przypadku rozwiązałem odtworzenie bazy danych. Dokonałem pewnych zmian w modelu i uruchomiłem Update-Database w konsoli Menedżera pakietów. Otrzymałem następujący błąd:
źródło
W przypadku: Jeśli dodanie kodu do WebApiConfig.cs lub Global.asax.cs nie działa dla Ciebie:
Dodaj funkcję .ToList ().
Wypróbowałem każde rozwiązanie, ale działały dla mnie następujące:
Mam nadzieję, że to pomoże.
źródło
w moim przypadku zostało to naprawione, gdy usunąłem słowo kluczowe virtual przed właściwościami nawigacji, mam na myśli tabele referencyjne. więc się zmieniłem
do:
źródło