Estoy trabajando con ASP.NET MVC 5 Web Api. Quiero consultar a todos mis usuarios.
Escribí api/users
y recibo esto:
"El tipo 'ObjectContent`1' no pudo serializar el cuerpo de la respuesta para el tipo de contenido 'application / json; charset = utf-8'"
En WebApiConfig, ya agregué estas líneas:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Pero todavía no funciona.
Mi función para devolver datos es esta:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
c#
asp.net
json
asp.net-web-api
CampDev
fuente
fuente
Respuestas:
Cuando se trata de devolver datos al consumidor desde Web Api (o cualquier otro servicio web para el caso), recomiendo no devolver entidades que provengan de una base de datos. Es mucho más confiable y fácil de mantener usar modelos en los que tiene control de cómo se ven los datos y no la base de datos. De esa manera, no tendrá que perder tanto tiempo con los formateadores en WebApiConfig. Puede crear un UserModel que tenga modelos secundarios como propiedades y deshacerse de los bucles de referencia en los objetos de retorno. Eso hace que el serializador sea mucho más feliz.
Además, no es necesario eliminar los formateadores o los tipos de medios admitidos normalmente si solo especifica el encabezado "Acepta" en la solicitud. Jugar con esas cosas a veces puede hacer que las cosas sean más confusas.
Ejemplo:
fuente
Si está trabajando con EF, además de agregar el siguiente código en Global.asax
No olvides importar
Entonces puede devolver sus propios modelos EF
¡Simple como eso!
fuente
Una respuesta correcta es una forma de hacerlo, sin embargo, es una exageración cuando puede solucionarlo mediante una configuración de configuración.
Es mejor usarlo en el constructor dbcontext
Error de API web de Asp.Net: el tipo 'ObjectContent`1' no pudo serializar el cuerpo de la respuesta para el tipo de contenido 'application / xml; charset = utf-8 '
fuente
Agregue este código a
global.asax
continuación enApplication_Start
:Actualizar de
.Ignore
a.Serialize
. Debe funcionar.fuente
fuente
No me gusta este código:
foreach(var user in db.Users)
Como alternativa, uno podría hacer algo como esto, que funcionó para mí:
Sin embargo, terminé usando la solución de Lucas Roselli.
Actualización: simplificado al devolver un objeto anónimo:
fuente
Lo resolví usando este código en el archivo WebApiConfig.cs
fuente
También existe este escenario que genera el mismo error:
En caso de que la devolución sea un
List<dynamic>
método de API webEjemplo:
Entonces, para este escenario use el [KnownTypeAttribute] en la clase de retorno (todos ellos) así:
¡Esto funciona para mí!
fuente
Agregar esto en su
Application_Start()
método deGlobal.asax
archivo debería resolver el problemaMÉTODO 2: [No recomendado]
Si está trabajando con EntityFramework, puede deshabilitar el proxy en su constructor de clases DbContext. NOTA: este código se eliminará si actualiza el modelo
fuente
Mi favorito personal: simplemente agregue el código a continuación a
App_Start/WebApiConfig.cs
. Esto devolverá json en lugar de XML de forma predeterminada y también evitará el error que tuvo. No es necesario editarGlobal.asax
para eliminar,XmlFormatter
etc.fuente
Usar AutoMapper ...
fuente
Utilice el siguiente espacio de nombres:
using System.Web.OData;
En vez de :
using System.Web.Http.OData;
Funcionó para mi
fuente
Agrega la siguiente línea
Dos formas de usar
ProxyCreationEnabled
comofalse
.Agréguelo dentro de
DBContext
ConstructorO
Agrega la línea dentro del
Get
métodofuente
Solución que funcionó para mí:
Úselo
[DataContract]
para la clase y los[DataMember]
atributos de cada propiedad a serializar. Esto es suficiente para obtener el resultado de Json (por ejemplo, de fiddler).Para obtener la serialización xml, escriba
Global.asax
este código:var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;
fuente
Para agregar a la respuesta de jensendp:
Pasaría la entidad a un modelo creado por el usuario y usaría los valores de esa entidad para establecer los valores en su modelo recién creado. Por ejemplo:
Luego cambie su tipo de retorno a:
IEnumerable<UserInformation>
fuente
Básicamente agrego una línea que son
a UsersController.cs
fuente
Utilice [Serializable] para la clase:
Ejemplo:
¡Funcionó para mí!
fuente
Tendrá que definir Serializer Formatter dentro de WebApiConfig.cs disponible en App_Start Folder como
Añadiendo config.Formatters.Remove (config.Formatters.XmlFormatter); // que le proporcionará datos en formato JSON
Añadiendo config.Formatters.Remove (config.Formatters.JsonFormatter); // que le proporcionará datos en formato XML
fuente
Simplemente coloque las siguientes líneas en global.asax:
Importar
fuente
Otro caso en el que recibí este error fue cuando mi consulta de base de datos devolvió un valor nulo, pero mi tipo de modelo de usuario / vista se estableció como no anulable. Por ejemplo, cambiar mi campo UserModel de
int
aint?
resuelto.fuente
¡Esto también sucede cuando el tipo de respuesta no es público! Devolví una clase interna ya que usé Visual Studio para generarme el tipo.
fuente
Si bien todas estas respuestas anteriores son correctas, es posible que desee verificar InnerException> ExceptionMessage .
Si dice algo como esto "La instancia de ObjectContext se ha eliminado y ya no se puede usar para operaciones que requieren una conexión. ". Esto podría ser un problema debido al comportamiento predeterminado del EF.
Al asignar LazyLoadingEnabled = false en su constructor DbContext hará el truco.
Para obtener una lectura más detallada sobre el comportamiento EagerLoading y LazyLoading de EF, consulte este artículo de MSDN .
fuente
En mi caso, he tenido un mensaje de error similar:
Pero cuando profundizo en él, el problema fue:
La forma en que resolví agregando
KnownType
.Esto se resolvió inspirado en esta respuesta .
Referencia: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx
fuente
Visual Studio 2017 o 2019 es totalmente imprudente en esto, porque Visual Studio requiere que la salida esté en formato json , mientras que el formato predeterminado de Visual Studio es " XmlFormat" (config.Formatters.XmlFormatter) .
Visual Studio debería hacer esto automáticamente en lugar de dar tantos problemas a los desarrolladores.
Para corregir este problema, vaya al archivo WebApiConfig.cs y agregue
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);
después de " config.MapHttpAttributeRoutes (); " en el método Register (HttpConfiguration config) . Esto permitiría que su proyecto produzca una salida json.
fuente
En mi caso resolví recrear la base de datos. Hice algunos cambios en un modelo y al iniciar Update-Database en Package Manager Console obtuve el siguiente error:
fuente
En caso de que no le funcione agregar código a WebApiConfig.cs o Global.asax.cs :
Agregue la función .ToList ().
Probé todas las soluciones, pero lo siguiente funcionó para mí:
Espero que ayude.
fuente
en mi caso, se solucionó cuando eliminé la palabra clave virtual antes de mis propiedades de navegación, me refiero a las tablas de referencia. así que cambié
a:
fuente