Saya sedang mengerjakan API web ASP.NET MVC, saya mengalami kesalahan ini:
Jenis 'ObjectContent`1' gagal membuat serial tubuh respons untuk jenis konten 'application / xml; charset = utf-8 '.
Pengontrol saya adalah:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
mengapa saya mendapatkan kesalahan ini?
c#
serialization
asp.net-web-api
Tamal kanti Dey
sumber
sumber
InnerException
properti pengecualian serialisasi untuk mencari tahu apa sebenarnya yang menyebabkan serialisasi gagal.Jawaban:
Bagi saya ini adalah masalah dengan referensi melingkar.
Jawaban yang diterima tidak berfungsi untuk saya karena hanya mengubah perilaku pemformat JSON, tetapi saya mendapatkan XML saat memanggil layanan dari browser.
Untuk memperbaikinya, saya mematikan XML dan memaksa hanya JSON yang dikembalikan.
Di file Global.asax, letakkan baris berikut di bagian atas metode Application_Start Anda:
Sekarang hanya hasil JSON yang akan dikembalikan. Jika Anda memerlukan hasil XML, Anda perlu mencari solusi lain.
sumber
di file global.asax Anda, dalam metode Application_start () tambahkan baris ini:
Saya harap itu membantu Anda!
sumber
Global.asax
'sApplication_Start
, tapi tidak ada perubahan.Saya punya masalah yang sama. Dan saya menyelesaikannya. Saya meletakkan konstruktor default ke kelas DTO.
Ex:
public class User { public User() { } }
Semoga berhasil dengan Anda!
sumber
Taruh ini di konstruktor. Semoga ini menyelesaikan masalah:
public MyController() { db.Configuration.ProxyCreationEnabled = false; }
sumber
Saya menemukan dua solusi untuk ini. Yang pertama dan termudah untuk diterapkan adalah dengan mengubah IEnumerables, ICollections ke jenis List. WebAPI dapat membuat serial objek ini, namun tidak dapat membuat serial tipe antarmuka.
public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here }
Opsi lainnya adalah tidak menggunakan serializer JSON asli dan menjalankan penggantian ini dalam metode Register di WebApi Config:
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);
sumber
Solusinya sederhana.
Setelah kueri LINQ tambahkan .ToList () (atau ToDictionary jika perlu).
Ini akan melakukan eager loading dari pada lazy loading data
sumber
IENumerable
dan menambahkan.TiList()
pengembalian berhasil untuk saya.** bug ini terjadi saat memanggil dari permintaan api web / wcf / ... dari sisi klien, tetapi sebagai efek sampingnya, Anda perlu menyertakan hubungan tergantung dengan memasukkan kata kunci. **
public CustomerPortalContext() : base("Name=CustomerPortalContext") { base.Configuration.ProxyCreationEnabled = false; }
sumber
Jika Anda bekerja dengan EF, selain menambahkan kode di bawah ini di Global.asax
Jangan lupa untuk mengimpor
using System.Data.Entity;
Kemudian Anda dapat mengembalikan Model EF Anda sendiri
sumber
silakan periksa dokumentasi api web untuk masalah ini, Menangani Referensi Objek Lingkaran
Salam
sumber
Jika Anda menggunakan api web dengan Entity Framework, solusinya bisa gagal untuk membuat serial respon di Web API dengan Json
Pada dasarnya, Anda perlu membuat model yang sesuai dengan setiap model EF, ini menghilangkan ketergantungan antar kelas dan memungkinkan serialisasi yang mudah.
Kode: (diambil dari tautan referensi)
Buat UserModel
public class UserModel { public string FirstName { get; set; } public string LastName { get; set; } }
Ubah metode saya 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; } }
sumber
Entitas Default 6 menggunakan XML untuk apis, dalam proyek Anda, temukan file "Global.asax" File dan tambahkan baris ini:
Baris ini menghapus XML Formatter.
sumber
tetapi jika Anda menemukan masalah ini dengan entitas / kelas lain, Anda harus membuat DTO baru untuk setiap kelas, dan jika Anda memiliki banyak dari mereka, Anda dapat menemukan masalah, juga menurut saya membuat DTO hanya untuk menyelesaikan masalah ini bukanlah cara terbaik ...
Apakah kamu sudah mencobanya?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
Salam
sumber
hmmm, Mengikuti semoga bisa membantu.
Saya mendapatkan pengecualian yang sama, dan dalam kasus saya, saya meneruskan entitas poco sebenarnya yang dibuat untuk kode entitas terlebih dahulu. Karena, ini berisi relasi dengan entitas lain, saya baru saja membuat entitas viewmapper / dto di atasnya untuk mengembalikannya.
Ini berfungsi dengan baik sekarang.
Entitas 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;} }
sumber
Pertanyaan Anda sangat mirip dengan pertanyaan saya. Anda tidak boleh mengembalikan data dari database secara langsung. Untuk ini, Anda harus membuat Model dan mengaitkan data yang ingin Anda perlihatkan.
Dalam contoh saya, Ada data tentang User yang Json tidak bisa serialisasi, saya telah membuat userModel dan, di API saya, saya mengembalikan userModel sebagai gantinya User dari database.
Logika konversi atau data asosiasi antara User dan UserModel harus ada di API.
Gagal untuk membuat serial respon di Web API dengan Json
sumber
Ini adalah kesalahan khusus yang saya dapatkan kembali dari panggilan API Web odata saya:
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.
Saya akhirnya menemukan bahwa kelas dbContext saya memiliki nama tabel yang berformat buruk yang ditugaskan di onModelCreating .. jadi SqlClient sekarat mencari tabel yang tidak ada di db saya !!
sumber