Saya bekerja dengan ASP.NET MVC 5 Web Api. Saya ingin berkonsultasi dengan semua pengguna saya.
Saya menulis api/users
dan saya menerima ini:
"Jenis 'ObjectContent`1' gagal membuat serial isi respons untuk jenis konten 'application / json; charset = utf-8'"
Di WebApiConfig, saya sudah menambahkan baris ini:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Tapi tetap tidak berhasil.
Fungsi saya untuk mengembalikan data adalah ini:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
c#
asp.net
json
asp.net-web-api
CampDev
sumber
sumber
Jawaban:
Ketika datang untuk mengembalikan data kembali ke konsumen dari Web Api (atau layanan web lainnya dalam hal ini), saya sangat menyarankan untuk tidak mengirimkan kembali entitas yang berasal dari database. Jauh lebih andal dan mudah dipelihara untuk menggunakan Model di mana Anda memiliki kendali atas seperti apa datanya dan bukan database. Dengan begitu, Anda tidak perlu terlalu banyak mengutak-atik pemformat di WebApiConfig. Anda bisa membuat UserModel yang memiliki Model turunan sebagai properti dan menyingkirkan loop referensi di objek yang dikembalikan. Itu membuat pembuat serial lebih bahagia.
Selain itu, tidak perlu menghapus pemformat atau jenis media yang didukung biasanya jika Anda hanya menentukan header "Menerima" dalam permintaan. Bermain-main dengan barang-barang itu terkadang bisa membuat segalanya lebih membingungkan.
Contoh:
sumber
Jika Anda bekerja dengan EF, selain menambahkan kode di bawah ini di Global.asax
Jangan lupa untuk mengimpor
Kemudian Anda dapat mengembalikan Model EF Anda sendiri
Sederhana seperti itu!
sumber
Memberikan jawaban yang benar adalah salah satu cara untuk pergi, namun itu berlebihan ketika Anda dapat memperbaikinya dengan satu pengaturan konfigurasi.
Lebih baik menggunakannya di konstruktor dbcontext
Kesalahan API Web Asp.Net: Jenis 'ObjectContent`1' gagal untuk membuat serial tubuh tanggapan untuk jenis konten 'application / xml; charset = utf-8 '
sumber
Tambahkan kode ini di
global.asax
bawah padaApplication_Start
:Perbarui dari
.Ignore
menjadi.Serialize
. Ini harus berhasil.sumber
sumber
Saya tidak suka kode ini:
foreach(var user in db.Users)
Sebagai alternatif, seseorang mungkin melakukan sesuatu seperti ini, yang berhasil untuk saya:
Namun, saya akhirnya menggunakan solusi Lucas Roselli.
Pembaruan: Disederhanakan dengan mengembalikan objek anonim:
sumber
Saya menyelesaikannya menggunakan kode ini ke file WebApiConfig.cs
sumber
Ada juga skenario ini yang menghasilkan kesalahan yang sama:
Dalam kasus pengembalian menjadi
List<dynamic>
metode api webContoh:
Jadi, untuk skenario ini gunakan [DiketahuiTipeAttribute] di kelas kembalian (semuanya) seperti ini:
Ini berhasil untuk saya!
sumber
Menambahkan ini ke
Application_Start()
metodeGlobal.asax
file Anda akan menyelesaikan masalahMETODE 2: [Tidak disarankan]
Jika Anda bekerja dengan EntityFramework, Anda dapat menonaktifkan proxy di konstruktor kelas DbContext Anda. CATATAN: kode ini akan dihapus jika Anda memperbarui model
sumber
Favorit pribadi saya: Cukup tambahkan kode di bawah ini ke
App_Start/WebApiConfig.cs
. Ini akan mengembalikan json sebagai ganti XML secara default dan juga mencegah kesalahan yang Anda alami. Tidak perlu mengeditGlobal.asax
untuk menghapusXmlFormatter
dll.sumber
Gunakan AutoMapper ...
sumber
Gunakan namespace berikut:
using System.Web.OData;
Dari pada :
using System.Web.Http.OData;
Itu berhasil untuk saya
sumber
Tambahkan baris di bawah ini
Dua cara untuk digunakan
ProxyCreationEnabled
sebagaifalse
.Tambahkan ke dalam
DBContext
ConstructorATAU
Tambahkan garis di dalam
Get
metodesumber
Solusi yang berhasil untuk saya:
Gunakan
[DataContract]
untuk kelas dan[DataMember]
atribut untuk setiap properti yang akan dibuat serial. Ini cukup untuk mendapatkan hasil Json (misalnya dari fiddler).Untuk mendapatkan serialisasi xml, tulis
Global.asax
kode ini:var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;
sumber
Untuk menambah jawaban jensendp:
Saya akan meneruskan entitas ke model yang dibuat pengguna dan menggunakan nilai dari entitas itu untuk mengatur nilai dalam model yang baru Anda buat. Sebagai contoh:
Kemudian ubah jenis pengembalian Anda menjadi:
IEnumerable<UserInformation>
sumber
Saya pada dasarnya menambahkan satu baris yang mana mereka
ke UsersController.cs
sumber
Gunakan [Serializable] untuk kelas:
Contoh:
Itu berhasil untuk saya!
sumber
Anda harus menentukan Serializer Formatter dalam WebApiConfig.cs yang tersedia di App_Start Folder seperti
Menambahkan config.Formatters.Remove (config.Formatters.XmlFormatter); // yang akan memberi Anda data dalam Format JSON
Menambahkan config.Formatters.Remove (config.Formatters.JsonFormatter); // yang akan memberi Anda data dalam Format XML
sumber
Letakkan saja baris berikut di global.asax:
Impor
sumber
Kasus lain di mana saya menerima kesalahan ini adalah ketika kueri database saya mengembalikan nilai nol tetapi jenis model pengguna / tampilan saya ditetapkan sebagai non-nullable. Misalnya, mengubah bidang UserModel saya dari
int
menjadiint?
terselesaikan.sumber
Ini juga terjadi jika Jenis-Tanggapan tidak bersifat publik! Saya mengembalikan kelas internal ketika saya menggunakan Visual Studio untuk menghasilkan saya tipe.
sumber
Meskipun semua jawaban di atas benar, Anda mungkin perlu memeriksa InnerException> ExceptionMessage .
Jika tertulis sesuatu seperti ini " Instance ObjectContext telah dibuang dan tidak dapat lagi digunakan untuk operasi yang memerlukan koneksi. ". Ini bisa menjadi masalah karena perilaku default EF.
Dengan menetapkan LazyLoadingEnabled = false di konstruktor DbContext Anda akan melakukan triknya.
Untuk bacaan yang lebih detail tentang perilaku EagerLoading dan LazyLoading dari EF lihat Artikel MSDN ini .
sumber
Dalam kasus saya, saya memiliki pesan kesalahan serupa:
Tetapi ketika saya menggali lebih dalam, masalahnya adalah:
Cara saya menyelesaikannya dengan menambahkan
KnownType
.Ini dipecahkan terinspirasi dari jawaban ini .
Referensi: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx
sumber
Visual Studio 2017 atau 2019 sama sekali tidak bijaksana dalam hal ini, karena Visual Studio sendiri membutuhkan output dalam format json , sedangkan format default Visual Studio adalah " XmlFormat" (config.Formatters.XmlFormatter) .
Visual Studio harus melakukan ini secara otomatis alih-alih memberi pengembang begitu banyak masalah.
Untuk memperbaiki masalah ini, buka file WebApiConfig.cs , dan tambahkan
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);
setelah " config.MapHttpAttributeRoutes (); " di metode Register (HttpConfiguration config) . Ini akan memungkinkan proyek Anda menghasilkan keluaran json.
sumber
Dalam kasus saya, saya memecahkan pembuatan ulang database. Saya membuat beberapa perubahan dalam model dan meluncurkan Update-Database di Package Manager Console. Saya mendapat Error berikut:
sumber
Dalam kasus: Jika menambahkan kode ke WebApiConfig.cs atau Global.asax.cs tidak berhasil untuk Anda:
Tambahkan fungsi .ToList ().
Saya mencoba setiap solusi tetapi yang berikut berhasil untuk saya:
Saya harap, ini membantu.
sumber
dalam kasus saya, itu diperbaiki ketika saya menghapus kata kunci virtual sebelum properti navigasi saya, maksud saya tabel referensi. jadi saya berubah
untuk:
sumber