Ошибка API-интерфейса Asp.Net: тип «ObjectContent`1» не смог сериализовать тело ответа для типа контента «application / xml»; кодировка = UTF-8′

Простейший пример этого, я получаю коллекцию и пытаюсь вывести ее через Web API:

// GET api/items public IEnumerable Get() { return MyContext.Items.ToList(); } 

И я получаю ошибку:

Объект типа
‘System.Data.Objects.ObjectQuery`1 [Dcip.Ams.BO.EquipmentWarranty]’ не может быть преобразован в тип
‘System.Data.Entity.DbSet`1 [Dcip.Ams.BO.EquipmentWarranty]

Это довольно распространенная ошибка, связанная с новыми прокси-серверами, и я знаю, что могу исправить ее, установив:

 MyContext.Configuration.ProxyCreationEnabled = false; 

Но это побеждает цель многих моих попыток. Есть ли способ лучше?

Я предлагаю отключить создание прокси только в том месте, где вам не нужно, или вызывает у вас проблемы. Вам не нужно отключать его во всем мире, вы можете просто отключить текущий контекст БД с помощью кода …

  [HttpGet] [WithDbContextApi] public HttpResponseMessage Get(int take = 10, int skip = 0) { CurrentDbContext.Configuration.ProxyCreationEnabled = false; var lista = CurrentDbContext.PaymentTypes .OrderByDescending(x => x.Id) .Skip(skip) .Take(take) .ToList(); var count = CurrentDbContext.PaymentTypes.Count(); return Request.CreateResponse(HttpStatusCode.OK, new { PaymentTypes = lista, TotalCount = count }); } 

Здесь я только отключил ProxyCreation в этом методе, потому что для каждого запроса создается новый DBC-контекст, и поэтому я только отключил ProxyCreation для этого случая. Надеюсь, поможет

если у вас есть свойства навигации, и вы не хотите сделать их не виртуальными, вы должны использовать JSON.NET и изменить конфигурацию в App_Start на использование JSON not XML!
после установки JSON.NET From NuGet, вставьте этот код в WebApiConfig.cs в метод Register

 var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter); 

Если у вас есть свойства навигации, сделайте их не виртуальными. Картирование по-прежнему будет работать, но это предотвратит создание объектов динамического прокси, которые не могут быть сериализованы.]

Отсутствие ленивой загрузки в WebApi прекрасен, так как у вас нет постоянного соединения, и вы все равно запускали .ToList ().

Я просто отключил прокси-classы по необходимости:

  // GET: ALL Employee public IEnumerable Get() { using (AdventureWorks_MBDEV_DW2008Entities entities = new AdventureWorks_MBDEV_DW2008Entities()) { entities.Configuration.ProxyCreationEnabled = false; return entities.DimEmployees.ToList(); } } 

Это помогло мне:
Добавьте следующий код в функцию Application_Start из Global.asax.cs

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; GlobalConfiguration.Configuration.Formatters .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 

В моем случае возвращаемый объект имел свойство внутри него с типом, у которого не было конструктора без аргументов / по умолчанию. Добавив конструктор нулевого аргумента к этому типу, объект может быть успешно сериализован.

  • Почему структура Entity Framework не может видеть информацию о столбце хранимой процедуры?
  • Шаблон хранилища, POCO и бизнес-объекты
  • Как преобразовать DbSet в инфраструктуру Entity в ObjectQuery
  • Можно ли запретить EntityFramework 4 переписывать настроенные свойства?
  • Как добавить проверку на мои classы POCO (шаблон)
  • Как отключить сущность из контекста в Entity Framework?
  • Зачем повторно инициировать DbContext при использовании Entity Framework?
  • Entity Framework Code First Fluent Api: добавление индексов в столбцы
  • Создание динамических запросов с инфраструктурой сущностей
  • Entity Framework 4 Single () vs First () vs FirstOrDefault ()
  • Как реализовать Единицу работы, которая работает с EF и NHibernate
  • Давайте будем гением компьютера.