Я работал над веб-API ASP.NET MVC, у меня такая ошибка:
Типу 'ObjectContent`1' не удалось сериализовать тело ответа для типа содержимого 'application / xml; charset = utf-8 '.
Мой контроллер:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
почему я получаю эту ошибку?
c#
serialization
asp.net-web-api
Тамал Канти Дей
источник
источник
InnerException
свойство исключения сериализации, чтобы узнать, что именно привело к сбою сериализации.Ответы:
Для меня это была проблема с круговой привязкой.
Принятый ответ не сработал для меня, потому что он изменяет только поведение средства форматирования JSON, но я получал XML, когда вызывал службу из браузера.
Чтобы исправить это, я отключил XML и заставил возвращать только JSON.
В файле Global.asax поместите следующие строки вверху вашего метода Application_Start:
Теперь будут возвращаться только результаты в формате JSON. Если вам нужны результаты в формате XML, вам нужно будет найти другое решение.
источник
в вашем файле global.asax в методе Application_start () добавьте эту строку:
Надеюсь, это вам поможет!
источник
Global.asax
sApplication_Start
, но без изменений.У меня та же проблема. И я решил это. Я помещаю конструктор по умолчанию в класс DTO.
Пример:
public class User { public User() { } }
Надеюсь, это сработает с вами!
источник
Поместите это в конструктор. Надеюсь, это решит проблему:
public MyController() { db.Configuration.ProxyCreationEnabled = false; }
источник
Я нашел два решения этого. Первый и самый простой в реализации - это изменить любые IEnumerables, ICollections на тип List. WebAPI может сериализовать эти объекты, но не может сериализовать типы интерфейсов.
public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here }
Другой вариант - не использовать собственный сериализатор JSON и запустить это переопределение в методе Register в WebApi Config:
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);
источник
Решение простое.
После запроса LINQ добавьте .ToList () (или ToDictionary, если необходимо).
Он будет загружать быстрее, чем ленивую загрузку данных
источник
IENumerable
и добавление.TiList()
к нему.** эта ошибка возникает при вызове из веб-запроса api / wcf / ... со стороны клиента, но в качестве побочного эффекта вам нужно будет включить зависимые отношения с помощью ключевого слова include. **
public CustomerPortalContext() : base("Name=CustomerPortalContext") { base.Configuration.ProxyCreationEnabled = false; }
источник
Если вы работаете с EF, помимо добавления кода ниже на Global.asax
Не забудьте импортировать
using System.Data.Entity;
Затем вы можете вернуть свои собственные модели EF
источник
Пожалуйста, проверьте документацию по веб-API для решения этой проблемы, Обработка круговых ссылок на объекты
С уважением
источник
Если вы используете веб-api с Entity Framework, решение может быть выполнить сериализацию ответа в веб-API с помощью Json
По сути, вам нужно создать модель, соответствующую каждой модели EF, это удаляет зависимости между классами и позволяет легко сериализовать.
Код: (взято из указанной ссылки)
Создать UserModel
public class UserModel { public string FirstName { get; set; } public string LastName { get; set; } }
Измените мой метод 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; } }
источник
По умолчанию Entity 6 использует XML для API. Найдите в своем проекте файл "Global.asax" и добавьте эту строку:
Эта строка удаляет средство форматирования XML.
источник
но если вы обнаружили эту проблему с другими сущностями / классами, вам нужно создать новый DTO для каждого класса, и если у вас их много, вы можете найти проблему, также я думаю, что создайте DTO только для решения этой проблемы не лучший способ ...
Вы пробовали это?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
С уважением
источник
хммм, может помочь следующее.
Я получал то же исключение, и в моем случае я сначала передавал фактическую сущность poco, созданную для кода сущности. Поскольку он содержит связь с другими объектами, я просто создал объект viewmapper / dto поверх него для возврата.
Теперь все работает нормально.
Poco Entity:
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;} }
источник
Ваш вопрос очень похож на мой. Вы не должны возвращать данные из базы данных напрямую. Для этого вы должны создать Модель и связать данные, которые вы хотите показать.
В моем примере есть данные о пользователе, которые Json не может сериализовать, я создал userModel и в своем API я возвращаю userModel вместо User из базы данных.
Логика преобразования или связывания данных между User и UserModel должна быть в API.
Не удалось сериализовать ответ в веб-API с помощью Json
источник
Это была конкретная ошибка, которую я получал при вызове веб-API odata:
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'.
Я наконец понял, что моему классу dbContext присвоено имя таблицы с плохо отформатированным форматом в onModelCreating ... так что SqlClient умирал в поисках таблицы, которой не было в моей базе данных !!
источник