Estou trabalhando com ASP.NET MVC 5 Web Api. Quero consultar todos os meus usuários.
Escrevi api/users
e recebo isto:
"O tipo 'ObjectContent`1' falhou ao serializar o corpo da resposta para o tipo de conteúdo 'application / json; charset = utf-8'"
No WebApiConfig, já adicionei estas linhas:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Mas ainda não funciona.
Minha função para dados de retorno é esta:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
c#
asp.net
json
asp.net-web-api
CampDev
fonte
fonte
Respostas:
Quando se trata de retornar dados ao consumidor da API Web (ou de qualquer outro serviço da Web), recomendo enfaticamente não transmitir entidades que vêm de um banco de dados. É muito mais confiável e sustentável usar modelos nos quais você tem controle da aparência dos dados e não do banco de dados. Assim, você não precisa mexer tanto com os formatadores no WebApiConfig. Você pode simplesmente criar um UserModel que tem modelos filhos como propriedades e se livrar dos loops de referência nos objetos de retorno. Isso deixa o serializador muito mais feliz.
Além disso, não é necessário remover formatadores ou tipos de mídia suportados normalmente se você estiver apenas especificando o cabeçalho "Aceita" na solicitação. Brincar com essas coisas às vezes pode tornar as coisas mais confusas.
Exemplo:
fonte
Se você está trabalhando com EF, além de adicionar o código abaixo em Global.asax
Não se esqueça de importar
Então você pode devolver seus próprios modelos EF
Simples assim!
fonte
Dada a resposta certa é um caminho a percorrer, no entanto, é um exagero quando você pode corrigi-lo por meio de uma configuração.
Melhor usá-lo no construtor dbcontext
Erro de API Web Asp.Net: O tipo 'ObjectContent`1' falhou ao serializar o corpo de resposta para o tipo de conteúdo 'application / xml; charset = utf-8 '
fonte
Adicione este código
global.asax
abaixo emApplication_Start
:Atualizar de
.Ignore
a.Serialize
. Deve funcionar.fonte
fonte
Eu não gosto deste código:
foreach(var user in db.Users)
Como alternativa, pode-se fazer algo assim, que funcionou para mim:
Porém, acabei usando a solução de Lucas Roselli.
Atualização: simplificado pelo retorno de um objeto anônimo:
fonte
Resolvi isso usando este código para o arquivo WebApiConfig.cs
fonte
Também existe este cenário que gera o mesmo erro:
No caso de o retorno ser um
List<dynamic>
método de API da webExemplo:
Portanto, para este cenário, use o [KnownTypeAttribute] na classe de retorno (todos eles) assim:
Isso funciona para mim!
fonte
Adicionar isso ao seu
Application_Start()
método deGlobal.asax
arquivo deve resolver o problemaMÉTODO 2: [Não recomendado]
Se você estiver trabalhando com EntityFramework, você pode desativar o proxy em seu construtor de classe DbContext. NOTA: este código será removido se você atualizar o modelo
fonte
Meu favorito pessoal: Basta adicionar o código abaixo para
App_Start/WebApiConfig.cs
. Isso retornará json em vez de XML por padrão e também evitará o erro que você teve. Não há necessidade de editarGlobal.asax
para removerXmlFormatter
etc.fonte
Usar AutoMapper ...
fonte
Use o seguinte namespace:
using System.Web.OData;
Ao invés de :
using System.Web.Http.OData;
Funcionou para mim
fonte
Adicione a linha abaixo
Duas maneiras de usar
ProxyCreationEnabled
comofalse
.Adicione-o dentro do
DBContext
ConstrutorOU
Adicione a linha dentro do
Get
métodofonte
Solução que funcionou para mim:
Use
[DataContract]
para a classe e os[DataMember]
atributos de cada propriedade a ser serializada. Isso é o suficiente para obter o resultado Json (por exemplo, do violinista).Para obter a serialização xml, escreva
Global.asax
neste código:var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;
fonte
Para adicionar à resposta de jensendp:
Gostaria de passar a entidade para um modelo criado pelo usuário e usar os valores dessa entidade para definir os valores em seu modelo recém-criado. Por exemplo:
Em seguida, altere seu tipo de retorno para:
IEnumerable<UserInformation>
fonte
Eu basicamente adiciono uma linha que eles são
para UsersController.cs
fonte
Use [Serializable] para a classe:
Exemplo:
Funcionou para mim!
fonte
Você terá que definir o Serializer Formatter dentro de WebApiConfig.cs disponível na pasta App_Start como
Adicionando config.Formatters.Remove (config.Formatters.XmlFormatter); // que fornecerá dados no formato JSON
Adicionando config.Formatters.Remove (config.Formatters.JsonFormatter); // que fornecerá dados em formato XML
fonte
Basta colocar as seguintes linhas em global.asax:
Importar
fonte
Outro caso em que recebi esse erro foi quando minha consulta de banco de dados retornou um valor nulo, mas meu tipo de modelo de usuário / visualização foi definido como não anulável. Por exemplo, alterando meu campo UserModel de
int
paraint?
resolvido.fonte
Isso também acontece quando o Tipo de resposta não é público! Retornei uma classe interna, pois usei o Visual Studio para gerar o tipo.
fonte
Embora todas as respostas acima estejam corretas, pode-se querer verificar a InnerException> ExceptionMessage .
Se disser algo como "A instância ObjectContext foi descartada e não pode mais ser usada para operações que requerem uma conexão. ". Isso pode ser um problema devido ao comportamento padrão do EF.
Ao atribuir LazyLoadingEnabled = false em seu construtor DbContext irá fazer o truque.
Para uma leitura mais detalhada sobre o comportamento de EagerLoading e LazyLoading da EF, consulte este artigo MSDN .
fonte
No meu caso, recebi uma mensagem de erro semelhante:
Mas quando vou mais fundo nisso, o problema era:
A maneira como resolvi adicionando
KnownType
.Isso foi resolvido inspirado nesta resposta .
Referência: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx
fonte
O Visual Studio 2017 ou 2019 é totalmente impensado nisso, porque o próprio Visual Studio requer que a saída esteja no formato json , enquanto o formato padrão do Visual Studio é " XmlFormat" (config.Formatters.XmlFormatter) .
O Visual Studio deve fazer isso automaticamente, em vez de dar tantos problemas aos desenvolvedores.
Para corrigir esse problema, vá para o arquivo WebApiConfig.cs e adicione
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);
após " config.MapHttpAttributeRoutes (); " no método Register (HttpConfiguration config) . Isso permitiria que seu projeto produzisse saída json.
fonte
No meu caso, resolvi recriar o banco de dados. Fiz algumas alterações em um modelo e, ao iniciar o Update-Database no Package Manager Console, obtive o seguinte erro:
fonte
Caso: Se adicionar código a WebApiConfig.cs ou Global.asax.cs não funcionar para você:
Adicione a função .ToList ().
Tentei todas as soluções, mas as seguintes funcionaram para mim:
Espero que ajude.
fonte
no meu caso, foi corrigido quando removi a palavra-chave virtual antes das minhas propriedades de navegação, ou seja, as tabelas de referência. então eu mudei
para:
fonte