Не удалось сериализовать ответ в Web API
Я работал над веб-API ASP.NET MVC, у меня эта ошибка:
Тип "ObjectContent`1" не смог сериализовать тело ответа для типа контента "application/xml"; кодировка = UTF-8'.
Мой контроллер:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
почему я получаю эту ошибку?
Ответы
Ответ 1
Для меня это была проблема с круговой ссылкой.
Принятый ответ не сработал у меня, потому что он меняет поведение форматирования JSON, но я получал XML, когда вызывал службу из браузера.
Чтобы исправить это, я отключил XML и принудительно возвращал только JSON.
В файле Global.asax поместите следующие строки вверху вашего метода Application_Start:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Теперь будут возвращены только результаты JSON. Если вам нужны результаты XML, вам нужно будет найти другое решение.
Ответ 2
в вашем файле global.asax, в методе Application_start() добавьте эту строку:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Я надеюсь, что это поможет!
Ответ 3
У меня такая же проблема. И я решил это. Я поместил конструктор по умолчанию в класс DTO.
Пример:
public class User
{
public User()
{
}
}
Надеюсь, он сработает с вами!
Ответ 4
Поместите это в конструктор. Надеюсь, что это решит проблему:
public MyController()
{
db.Configuration.ProxyCreationEnabled = false;
}
Ответ 5
Я нашел два решения. Первым и самым простым в реализации является изменение любых 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);
Ответ 6
Решение прост.
После запроса LINQ добавьте .ToList() (или ToDictionary, если это необходимо).
Он будет делать загрузку, чем ленивая загрузка данных.
Ответ 7
**
эта ошибка возникает при вызове с веб-сайта api/wcf/... с клиентской стороны, но в качестве побочного эффекта вам необходимо включить зависимые отношения по ключевому слову include.
**
public CustomerPortalContext()
: base("Name=CustomerPortalContext")
{
base.Configuration.ProxyCreationEnabled = false;
}
Ответ 8
Если вы работаете с EF, помимо добавления кода ниже на Global.asax
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Не забывайте импортировать
using System.Data.Entity;
Затем вы можете вернуть свои собственные модели EF
Ответ 9
пожалуйста, проверьте документацию на веб-страницу api для этой проблемы, Обработка ссылок на круговые объекты
Привет
Ответ 10
Если вы используете веб-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;
}
}
Ответ 11
hmmm, После этого может помочь.
Я получал такое же исключение, и в моем случае я сначала передавал фактический объект 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;}
}
Ответ 12
но если вы обнаружили эту проблему с другими объектами/классами, вам нужно создать новый DTO для каждого класса, и если у вас их много, вы можете найти проблему, также я думаю, что создаю DTO только для решение этой проблемы - не лучший способ...
Вы пробовали это?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;
Привет
Ответ 13
Объект по умолчанию 6 использует XML для apis в вашем проекте, найдите файл "Global.asax" File и добавьте эту строку:
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Эта строка удаляет XML Formatter.
Ответ 14
Ваш вопрос очень похож на мой. Вы не должны возвращать данные из базы данных напрямую. Для этого вам необходимо создать модель и ассоциировать данные, которые вы хотите показать.
В моем примере, Есть данные о пользователе, что Json не может сериализоваться, я создал userModel, и в моем API я возвращаю UserModel вместо User из базы данных.
Логика преобразования или ассоциирования данных между User и UserModel должна быть в API.
Не удалось выполнить сериализацию ответа в веб-API с помощью Json
Ответ 15
Это была особая ошибка, с которой я возвращался из моего вызова API Одаты:
The 'ObjectContent`1' type failed to serialize the response
body for content type 'application/json; odata.metadata=minimal'.
Наконец-то выяснилось, что у моего класса dbContext было присвоено плохо форматированное имя таблицы в onModelCreating.. поэтому SqlClient умирал, ища таблицу , которая не существовала в моем db!!