asp - fromuri c# web api
Error al serializar la respuesta en la API web (15)
** Este error se produce cuando se realiza una llamada desde la solicitud web api / wcf / ... desde el lado del cliente, pero como efecto colateral, deberá incluir relaciones dependientes mediante la palabra clave include. **
public CustomerPortalContext()
: base("Name=CustomerPortalContext")
{
base.Configuration.ProxyCreationEnabled = false;
}
Estaba trabajando en ASP.NET MVC web API, 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é estoy recibiendo este error?
Encontré dos soluciones para esto. El primero y más fácil de implementar es cambiar cualquier IEnumerables, ICollections a un tipo de lista. La 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 de registro de la configuración de WebApi:
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
Este fue 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 asignado un nombre de tabla mal formateado en onModelCreating ... ¡¡así que el SqlClient estaba muriendo buscando una tabla que no existía en mi db !!
La solución es simple.
Después de la consulta LINQ, agregue .ToList () (o ToDictionary si es necesario).
Hará una carga ansiosa que la carga lenta de los datos
Para mí, este era un problema con las referencias circulares.
La respuesta aceptada no funcionó para mí porque solo cambia el comportamiento del formateador JSON, pero recibí XML cuando llamé al servicio desde el navegador.
Para solucionar esto, apagué XML y forcé solo que se devolviera JSON.
En el archivo Global.asax, coloque las siguientes líneas en la parte superior de su método Application_Start:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Ahora solo se devolverán los resultados de JSON. Si necesita resultados XML, deberá encontrar una solución diferente.
Pon esto en constructor. Espero que esto resuelva el problema:
public MyController()
{
db.Configuration.ProxyCreationEnabled = false;
}
Si está trabajando con EF, además de agregar el código a continuación en Global.asax
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
No te olvides de importar
using System.Data.Entity;
Entonces puedes devolver tus propios modelos EF
Si usa la API web con Entity Framework, puede fallar una solución para serializar la respuesta en la API web con Json
Básicamente, debe crear un modelo correspondiente a cada modelo de EF, esto elimina las dependencias entre las clases y permite una fácil serialización.
Código: (tomado del enlace al que se hace 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;
}
}
Tengo el mismo problema. Y lo solucioné Puse el constructor por defecto a la clase DTO.
Ex:
public class User
{
public User()
{
}
}
Espero que funcione con usted!
Tu pregunta es bastante similar a la mía. No debe devolver datos de la base de datos directamente. Para esto, debe crear el modelo y asociar los datos que desea mostrar.
En mi ejemplo, hay datos sobre el usuario que Json no pudo serializar, tuve que crear un modelo de usuario y, en mi API, devuelvo UserModel en lugar de usuario de la base de datos.
La lógica de convertir o asociar datos entre Usuario y UserModel debe estar en API.
consulte la documentación de la API web para este problema, Manejo de referencias de objetos circulares
Saludos
en su archivo global.asax, en el método Application_start () agregue esta línea:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
¡Espero que eso te ayude!
hmmm, lo siguiente puede ayudar.
Recibía la misma excepción, y en mi caso, primero estaba pasando la entidad poco real creada para el código de entidad. Dado que, contiene una relación con otras entidades, acabo de crear la entidad viewmapper / dto en la parte superior para volver.
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;}
}
pero si encuentras este problema con otras entidades / clases, tienes que crear un DTO nuevo para cada clase, y si tienes muchas, puedes encontrar un problema, también creo que crear una DTO solo para resolver este problema no es la mejor manera ...
¿Has intentado esto?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;
Saludos
La Entidad 6 predeterminada usa XML para apis, en su proyecto, encuentre el archivo "Global.asax" y agregue esta línea:
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Esta línea elimina el formateador XML.