Eu estava trabalhando na API da web ASP.NET MVC, estou tendo este erro:
O tipo 'ObjectContent`1' falhou ao serializar o corpo da resposta para o tipo de conteúdo 'application / xml; charset = utf-8 '.
Meu controlador é:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
por que estou recebendo este erro?
c#
serialization
asp.net-web-api
Tamal kanti Dey
fonte
fonte
InnerException
propriedade da exceção de serialização para descobrir o que exatamente causou a falha da serialização.Respostas:
Para mim, esse era um problema de referência circular.
A resposta aceita não funcionou para mim porque ela apenas altera o comportamento do formatador JSON, mas eu estava recebendo XML quando chamei o serviço do navegador.
Para corrigir isso, desliguei o XML e forcei apenas o retorno de JSON.
No arquivo Global.asax, coloque as seguintes linhas na parte superior do seu método Application_Start:
Agora, apenas resultados JSON serão retornados. Se precisar de resultados XML, você precisará encontrar uma solução diferente.
fonte
no seu arquivo global.asax, no método Application_start () adicione esta linha:
Espero que isso te ajude!
fonte
Global.asax
deApplication_Start
, mas sem alteração.Eu tenho o mesmo problema. E eu resolvi. Coloquei o construtor padrão na classe DTO.
Ex:
public class User { public User() { } }
Espero que funcione com você!
fonte
Coloque isso no construtor. Espero que isso resolva o problema:
public MyController() { db.Configuration.ProxyCreationEnabled = false; }
fonte
Eu encontrei duas soluções para isso. O primeiro e mais fácil de implementar é alterar qualquer IEnumerables, ICollections para um tipo de List. A WebAPI pode serializar esses objetos, mas não pode serializar os tipos de interface.
public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here }
A outra opção é não usar o serializador JSON nativo e executar essa substituição no método Register do WebApi Config:
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);
fonte
A solução é simples.
Após a consulta LINQ, adicione .ToList () (ou ToDictionary, se necessário).
Ele fará o carregamento mais rápido do que o carregamento lento dos dados
fonte
IENumerable
e adicionar.TiList()
ao retorno funcionou para mim.** este bug ocorre ao chamar a partir de request web api / wcf / ... do lado do cliente, mas como efeito colateral, você precisará incluir relações dependentes pela palavra-chave include. **
public CustomerPortalContext() : base("Name=CustomerPortalContext") { base.Configuration.ProxyCreationEnabled = false; }
fonte
Se você está trabalhando com EF, além de adicionar o código abaixo no Global.asax
Não se esqueça de importar
using System.Data.Entity;
Então você pode devolver seus próprios modelos EF
fonte
verifique a documentação da API da web para este problema, Handling Circular Object References
Saudações
fonte
Se você usar a API da Web com o Entity Framework, uma solução pode ser Falha ao serializar a resposta na API da Web com Json
Basicamente, você precisa criar um modelo correspondente a cada modelo de EF, isso remove as dependências entre as classes e permite a serialização fácil.
Código: (retirado do link referenciado)
Crie um UserModel
public class UserModel { public string FirstName { get; set; } public string LastName { get; set; } }
Alterar meu 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; } }
fonte
Default Entity 6 usa XML para apis, em seu projeto, encontre o arquivo "Global.asax" File e adicione esta linha:
Esta linha remove o formatador XML.
fonte
mas se você encontrou esse problema com outras entidades / classes, você tem que criar um novo DTO para cada classe, e se você tiver muitos deles, você pode encontrar um problema, também acho que criar um DTO só para resolver esse problema não é a melhor maneira ...
Você tentou isso?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
Saudações
fonte
hmmm, Seguir pode ajudar.
Eu estava recebendo a mesma exceção e, no meu caso, estava passando a entidade poco real criada para o código de entidade primeiro. Como ele contém relação com outras entidades, acabei de criar a entidade viewmapper / dto em cima dela para retornar.
Funciona bem agora.
Entidade 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;} }
fonte
Sua pergunta é bastante semelhante à minha. Você não deve retornar dados do banco de dados diretamente. Para isso, você deve criar o modelo e associar os dados que deseja mostrar.
No meu exemplo, há dados sobre o usuário que Json não conseguiu serializar, criei um userModel e, em minha API, retornei userModel em vez de User do banco de dados.
A lógica de converter ou associar dados entre User e UserModel deve estar na API.
Falha ao serializar a resposta na API da Web com Json
fonte
Este era o erro específico que eu estava obtendo da minha chamada de API da Web odata:
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.
Eu finalmente descobri que minha classe dbContext tinha um nome de tabela mal formatado sendo atribuído em onModelCreating .. então o SqlClient estava morrendo procurando por uma tabela que não existia em meu banco de dados !!
fonte