Ошибка 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]
- Отображение типа CLR типа EDM неоднозначно с EF 6 и 5?
- EF Code First: Как я могу увидеть свойство EntityValidationErrors из консоли пакета nuget?
- Использование System.ComponentModel.DataAnnotations с Entity Framework 4.0
- Указанный член типа не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности
- Указанное именованное соединение либо не находится в конфигурации, не предназначено для использования с поставщиком EntityClient, либо недействительно
Это довольно распространенная ошибка, связанная с новыми прокси-серверами, и я знаю, что могу исправить ее, установив:
MyContext.Configuration.ProxyCreationEnabled = false;
Но это побеждает цель многих моих попыток. Есть ли способ лучше?
- Что такое независимые ассоциации и ассоциации с иностранными ключами?
- Преобразование Entity Framework / Linq EXpression из строки в int
- Использование свойств DateTime в Code-First Entity Framework и SQL Server
- Является ли DbContext таким же, как DataContext?
- Исключить поле / свойство из базы данных с Entity Framework 4 и Code-First
- Инициализация платформы Entity - SLOW - что я могу сделать, чтобы быстрее запустить ее?
- Результат запроса нельзя перечислить более одного раза
- Использование MySql с Entity Framework 4 и Code-First Development CTP
Я предлагаю отключить создание прокси только в том месте, где вам не нужно, или вызывает у вас проблемы. Вам не нужно отключать его во всем мире, вы можете просто отключить текущий контекст БД с помощью кода …
[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);
В моем случае возвращаемый объект имел свойство внутри него с типом, у которого не было конструктора без аргументов / по умолчанию. Добавив конструктор нулевого аргумента к этому типу, объект может быть успешно сериализован.