Я работаю с ASP.NET MVC 5 Web Api. Я хочу проконсультироваться со всеми моими пользователями.
Я написал api/users
и получаю это:
«Типу 'ObjectContent`1' не удалось сериализовать тело ответа для типа контента 'application / json; charset = utf-8'»
В WebApiConfig я уже добавил эти строки:
HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Но все равно не работает.
Моя функция для возвращаемых данных такова:
public IEnumerable<User> GetAll()
{
using (Database db = new Database())
{
return db.Users.ToList();
}
}
c#
asp.net
json
asp.net-web-api
CampDev
источник
источник
Ответы:
Когда дело доходит до возврата данных потребителю из Web Api (или любой другой веб-службы, если на то пошло), я настоятельно рекомендую не передавать обратно объекты, поступающие из базы данных. Гораздо надежнее и удобнее использовать модели, в которых вы можете контролировать, как выглядят данные, а не базу данных. Таким образом, вам не придется так много возиться с форматерами в WebApiConfig. Вы можете просто создать UserModel с дочерними моделями в качестве свойств и избавиться от циклов ссылок в возвращаемых объектах. Это делает сериализатор намного счастливее.
Кроме того, обычно нет необходимости удалять средства форматирования или поддерживаемые типы мультимедиа, если вы просто указываете заголовок «Accepts» в запросе. Игра с этим иногда может запутать вас еще больше.
Пример:
источник
Если вы работаете с EF, помимо добавления кода ниже на Global.asax
Не забудьте импортировать
Затем вы можете вернуть свои собственные модели EF
Просто как тот!
источник
Правильный ответ - это один из возможных вариантов, однако это перебор, когда вы можете исправить это с помощью одной настройки конфигурации.
Лучше использовать его в конструкторе dbcontext
Ошибка веб-API Asp.Net: типу ObjectContent`1 не удалось сериализовать тело ответа для типа контента application / xml; charset = utf-8 '
источник
Добавьте этот код
global.asax
нижеApplication_Start
:Обновить с
.Ignore
на.Serialize
. Это должно сработать.источник
источник
Мне не нравится этот код:
foreach(var user in db.Users)
В качестве альтернативы можно было бы сделать что-то вроде этого, что сработало для меня:
Однако в итоге я использовал решение Лукаса Роселли.
Обновление: упрощено за счет возврата анонимного объекта:
источник
Я решил это, используя этот код в файле WebApiConfig.cs
источник
Также существует сценарий, который генерирует такую же ошибку:
В случае возврата
List<dynamic>
к методу веб-APIПример:
Итак, для этого сценария используйте [KnownTypeAttribute] в возвращаемом классе (все они) следующим образом:
У меня это работает!
источник
Добавление этого в свой
Application_Start()
методGlobal.asax
файла должно решить проблемуМЕТОД 2: [Не рекомендуется]
Если вы работаете с EntityFramework, вы можете отключить прокси в конструкторе класса DbContext. ПРИМЕЧАНИЕ: этот код будет удален, если вы обновите модель.
источник
Мой личный фаворит: просто добавьте приведенный ниже код в
App_Start/WebApiConfig.cs
. Это вернет json вместо XML по умолчанию, а также предотвратит возникшую ошибку. Не нужно редактировать,Global.asax
чтобы удалитьXmlFormatter
и т. Д.источник
Используйте AutoMapper ...
источник
Используйте следующее пространство имен:
using System.Web.OData;
Вместо того :
using System.Web.Http.OData;
Это сработало для меня
источник
Добавьте строку ниже
Два способа использования
ProxyCreationEnabled
asfalse
.Добавьте его в
DBContext
конструкторИЛИ
Добавьте строку внутри
Get
методаисточник
Решение, которое сработало для меня:
Используйте
[DataContract]
для класса и[DataMember]
атрибутов для каждого сериализуемого свойства. Этого достаточно, чтобы получить результат Json (например, от скрипачей).Чтобы получить сериализацию xml, напишите в
Global.asax
этом коде:var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; xml.UseXmlSerializer = true;
источник
Чтобы добавить к ответу jensendp:
Я бы передал объект в созданную пользователем модель и использовал значения из этого объекта для установки значений в вашей вновь созданной модели. Например:
Затем измените тип возвращаемого значения на:
IEnumerable<UserInformation>
источник
Я в основном добавляю одну строчку, в которой они
в UsersController.cs
источник
Используйте [Serializable] для класса:
Пример:
У меня это сработало!
источник
Вам нужно будет определить Serializer Formatter в WebApiConfig.cs, доступном в папке App_Start, например
Добавление config.Formatters.Remove (config.Formatters.XmlFormatter); // который предоставит вам данные в формате JSON
Добавление config.Formatters.Remove (config.Formatters.JsonFormatter); // который предоставит вам данные в формате XML
источник
Просто введите следующие строки в global.asax:
Импортировать
источник
Еще один случай, когда я получил эту ошибку, - это когда мой запрос к базе данных возвратил нулевое значение, но мой тип модели пользователь / представление был установлен как не допускающий значения NULL. Например, изменение моего поля UserModel с
int
наint?
разрешенное.источник
Это также происходит, когда Response-Type не является общедоступным! Я вернул внутренний класс, поскольку использовал Visual Studio для создания типа.
источник
Хотя все приведенные выше ответы верны, можно проверить InnerException> ExceptionMessage .
Если он говорит что-то вроде этого: « Экземпляр ObjectContext удален и больше не может использоваться для операций, требующих подключения. ». Это может быть проблемой из-за поведения EF по умолчанию.
Назначая LazyLoadingEnabled = ложь в конструкторе DbContext будет делать трюк.
Для получения более подробной информации о поведении EagerLoading и LazyLoading EF обратитесь к этой статье MSDN .
источник
В моем случае у меня было аналогичное сообщение об ошибке:
Но когда я копнул глубже, проблема была в следующем:
Способ, которым я решил, добавив
KnownType
.Это было решено на основе этого ответа .
Ссылка: https://msdn.microsoft.com/en-us/library/ms730167(v=vs.100).aspx
источник
Visual Studio 2017 или 2019 совершенно не думают об этом, потому что сама Visual Studio требует, чтобы вывод был в формате json , в то время как формат Visual Studio по умолчанию - « XmlFormat» (config.Formatters.XmlFormatter) .
Visual Studio должна делать это автоматически, чтобы не доставлять разработчикам столько хлопот.
Чтобы исправить эту проблему, перейдите в файл WebApiConfig.cs и добавьте
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove (config.Formatters.XmlFormatter);
после " config.MapHttpAttributeRoutes (); " в методе Register (конфигурация HttpConfiguration) . Это позволит вашему проекту производить вывод в формате json.
источник
В моем случае я решил воссоздать базу данных. Я внес некоторые изменения в модель и, запустив Update-Database в консоли диспетчера пакетов, получил следующую ошибку:
источник
В случае: если добавление кода в WebApiConfig.cs или Global.asax.cs у вас не работает:
Добавить функцию .ToList ().
Я опробовал все решения, но у меня сработало следующее:
Я надеюсь, что это помогает.
источник
в моем случае это было исправлено, когда я удалил ключевое слово virtual перед своими свойствами навигации, я имею в виду справочные таблицы. поэтому я изменил
кому:
источник