Estaba trabajando en la API web ASP.NET MVC, tengo este error:
El tipo 'ObjectContent`1' no pudo serializar el cuerpo de la respuesta para el tipo de contenido 'application / xml; charset = utf-8 '.
Mi controlador es:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
¿Por qué recibo este error?
c#
serialization
asp.net-web-api
Tamal kanti Dey
fuente
fuente
InnerException
propiedad de la excepción de serialización para averiguar qué causó exactamente que fallara la serialización.Respuestas:
Para mí, esto fue un problema con las referencias circulares.
La respuesta aceptada no me funcionó porque solo cambia el comportamiento del formateador JSON, pero estaba obteniendo XML cuando llamé al servicio desde el navegador.
Para solucionar esto, apagué XML y obligué a que solo se devolviera JSON.
En el archivo Global.asax, coloque las siguientes líneas en la parte superior de su método Application_Start:
Ahora solo se devolverán los resultados JSON. Si necesita resultados XML, deberá encontrar una solución diferente.
fuente
en su archivo global.asax, en el método Application_start () agregue esta línea:
¡Espero que eso te ayude!
fuente
Global.asax
'sApplication_Start
, pero sin cambios.Tengo el mismo problema. Y lo resolví. Pongo el constructor predeterminado en la clase DTO.
Ex:
public class User { public User() { } }
¡Espero que funcione contigo!
fuente
Pon esto en constructor. Espero que esto resuelva el problema:
public MyController() { db.Configuration.ProxyCreationEnabled = false; }
fuente
Encontré dos soluciones para esto. La primera y más fácil de implementar es cambiar cualquier IEnumerables, ICollections a un tipo de Lista. WebAPI puede serializar estos objetos, sin embargo, no puede serializar tipos de interfaz.
public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here }
La otra opción es no usar el serializador JSON nativo y ejecutar esta anulación en el método Register de WebApi Config:
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);
fuente
La solución es simple.
Después de la consulta LINQ, agregue .ToList () (o ToDictionary si es necesario).
Hará una carga ansiosa que una carga diferida de los datos
fuente
IENumerable
agregar.TiList()
al retorno funcionó para mí.** este error ocurre cuando se llama desde la solicitud web api / wcf / ... desde el lado del cliente, pero como efecto secundario, deberá incluir las relaciones dependientes mediante la palabra clave include. **
public CustomerPortalContext() : base("Name=CustomerPortalContext") { base.Configuration.ProxyCreationEnabled = false; }
fuente
Si está trabajando con EF, además de agregar el siguiente código en Global.asax
No olvides importar
using System.Data.Entity;
Entonces puede devolver sus propios modelos EF
fuente
por favor, consulte la documentación de la API web para este problema, Manejo de referencias de objetos circulares
Saludos
fuente
Si usa la API web con Entity Framework, es posible que una solución no pueda serializar la respuesta en la API web con Json
Básicamente, necesita crear un modelo correspondiente a cada modelo EF, esto elimina las dependencias entre clases y permite una fácil serialización.
Código: (tomado del enlace de referencia)
Crear un modelo de usuario
public class UserModel { public string FirstName { get; set; } public string LastName { get; set; } }
Cambiar mi método 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; } }
fuente
La Entidad 6 predeterminada usa XML para apis, en su proyecto, busque el archivo "Global.asax" File y agregue esta línea:
Esta línea elimina el formateador XML.
fuente
pero si encontraste este problema con otras entidades / clases, tienes que crear un nuevo DTO para cada clase, y si tienes muchos de ellos, puedes encontrar un problema, también creo que crear un DTO solo para resolver este problema no es la mejor manera ...
¿Intentaste esto?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
Saludos
fuente
hmmm, lo siguiente puede ayudar.
Recibía la misma excepción y, en mi caso, pasaba primero la entidad poco real creada para el código de entidad. Dado que contiene relación con otras entidades, acabo de crear la entidad viewmapper / dto encima para regresar.
Funciona bien ahora.
Entidad 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;} }
fuente
Tu pregunta es bastante similar a la mía. No debe devolver datos de la base de datos directamente. Para ello, debe crear el modelo y asociar los datos que desea mostrar.
En mi ejemplo, hay datos sobre User que Json no pudo serializar, tuve que crear un userModel y, en mi API, devuelvo userModel en lugar de User from database.
La lógica de convertir o asociar datos entre User y UserModel debe estar en API.
No se pudo serializar la respuesta en la API web con Json
fuente
Este era el error específico que recibía de mi llamada a la API web de odata:
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.
Finalmente descubrí que mi clase dbContext tenía un nombre de tabla mal formateado que se estaba asignando en onModelCreating ... ¡¡así que SqlClient se estaba muriendo buscando una tabla que no existía en mi base de datos !!
fuente