Ошибка при десериализации объекта в WCF

Я создал службу REST в WCF. Я столкнулся со следующей проблемой.

Ошибка десериализации объекта типа System.Collections.Generic.IList. Максимальная глубина чтения (32) превышена, поскольку считываемые данные XML имеют больше уровней вложенности, чем разрешено квотой. Эта квота может быть увеличена путем изменения свойства MaxDepth объекта XmlDictionaryReaderQuotas, используемого при создании XML-ридера.

Я не указал какой-либо тип привязки в конфигурации, так как я разработал сервис в соответствии с REST Starter Kit. Пожалуйста, предложите что-нибудь относительно того, как я могу это исправить.

Иногда код работает нормально, но он вызывает ошибку.

Ответ 1

В моем случае проблема заключалась в том, что я возвращал объекты Entity Framework, которые я получил из контекста данных. Решение заключалось в том, чтобы отделить каждый объект до его перенастройки.

Ответ 2

В моем случае отсоединение объектов было невозможно, потому что контекст EF уже был удален.

Вместо этого я использовал метод расширения AsNotTracking.

... В некоторых других случаях мне также пришлось разрезать циклические ссылки, установив для некоторых свойств навигации значение null.

... И DataContract(IsReference = true) не выполнил трюк.

Подробнее об этой проблеме можно найти здесь: N-level Entity Framework и отладка проблем WCF

Ответ 4

У меня была такая же проблема сегодня. Это может быть круговая ссылка, если вы не правильно установили KnowType и IsReference в своем контракте с данными. Сначала проверьте эти пункты. Действительно!

Но когда вы сталкиваетесь с таким поведением.

Иногда код работает нормально, но он вызывает ошибку.

Вы также должны проверить, является ли график, который вы отправляете на проводе, глубокий и сложный (например, более двух навигационных свойств). Тогда это может быть просто MaxDepth из ReaderQuotas в вашей конфигурации привязки, которая слишком низкая. Ваша служба будет работать, когда ваши самые глубокие свойства навигации будут пустыми, но будут вызывать эту ошибку, если они содержат хотя бы один элемент.

Значение по умолчанию для этой конфигурации равно 32, поэтому попробуйте 64.

Теперь мы можем спорить о дизайне плохого качества, используя слишком большой график для обслуживания по сравнению с низким значением по умолчанию в конфигурации WCF.

Я не говорю, что вам нужно разбить свой график в меньшей части, но вы должны.