Сложные типы данных в WCF? - PullRequest
21 голосов
/ 15 октября 2008

Я столкнулся с проблемой при попытке вернуть объект, который содержит коллекцию дочерних объектов, которые снова могут содержать коллекцию объектов внуков. Я получаю сообщение об ошибке «Соединение принудительно закрыто хостом».

Есть ли способ заставить эту работу? В настоящее время у меня есть структура, похожая на это:

псевдокод:

Person:
IEnumerable<Order>

Order:
IEnumerable<OrderLine>

Все три объекта имеют атрибут DataContract, а все открытые свойства, которые я хочу раскрыть (включая IEnumerable), имеют атрибут DataMember.

У меня есть несколько OperationContract в моем сервисе, и все методы, возвращающие один объект ИЛИ IEnumerable объекта, работают отлично. Только когда я пытаюсь вложить IEnumerable, получается плохо. Также в моей справке по обслуживанию клиентов я выбрал общий список в качестве типа моей коллекции. Я просто хочу подчеркнуть, что только одна из моих операций / методов терпит неудачу с этой ошибкой - остальные работают отлично .

РЕДАКТИРОВАТЬ (более подробное описание ошибки):

[SocketException (0x2746): An existing connection was forcibly closed by
the remote host]
[IOException: Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote host.]
[WebException: The underlying connection was closed: An unexpected
error occurred on a receive.]
[CommunicationException: An error occurred while receiving the HTTP
response to http://myservice.mydomain.dk/MyService.svc. This could
be due to the service endpoint binding not using the HTTP protocol.
This could also be due to an HTTP request context being aborted by
the server (possibly due to the service shutting down). See server
logs for more details.]

Я пытался искать журналы, но не могу их найти ... также я использую WSHttpBinding и конечную точку http.

Ответы [ 14 ]

38 голосов
/ 20 октября 2008

В качестве примечания вам нужно научиться пользоваться утилитами журналирования WCF:

Информация о регистрации.

Редактор конфигурации (упрощает настройку).

Просмотрщик трасс. Совершенно потрясающе. Позволяет нескольким службам (клиенту и серверу) отслеживать и присоединяться к ним, помогая анализировать все детали Позволяет быстро добраться до корня проблем. (Потому что при ошибке сервера WCF клиент вряд ли получит полезные данные.)

11 голосов
/ 15 октября 2008

Хорошо, я наконец нашел реальную проблему в моем случае. Кажется, разоблачение перечислений - не самая лучшая вещь в мире. Я либо должен установить для них значение по умолчанию, либо вместо этого выставить свойство в виде типа int или любого целочисленного типа, на котором основано мое перечисление.

Спасибо за помощь, у вас не было возможности узнать это - я обнаружил перечисления на 3-м уровне в моей структуре и систематически удалял камеры данных один за другим, как я узнал. Кажется, я не единственный, кто столкнулся с этой проблемой - у этого парня, очевидно, были похожие проблемы :)

http://zianet.dk/blog/2007/11/24/serializing-enums-in-wcf/

10 голосов
/ 29 октября 2010

Если вы работаете с WCF + (EF + POCO), попробуйте установить,

ObjectContext.ContextOptions.LazyLoadingEnabled = false;
ObjectContext.ContextOptions.ProxyCreationEnabled = false;
3 голосов
/ 09 января 2011

Перечисления получают атрибут DataContract, как и любой класс, но значения перечисления не должны иметь атрибутов DataMember.

Измените их на EnumMember, и вы перестанете получать эту непостижимую ошибку.

3 голосов
/ 19 марта 2010

Добавьте эту строку в <system.web/>:

<httpRuntime maxRequestLength="102400" executionTimeout="3600" />
1 голос
/ 22 января 2010

У меня тоже была такая же проблема (.Net 3.5). Оказывается, в моем базовом классе DataContract отсутствовал известный тип. К сожалению, ошибка WCF не была более описательной.

1 голос
/ 15 октября 2008

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

У меня были похожие ошибки при попытке вернуть обычные IEnumerables, которые были перезаписаны (они были помечены как виртуальные) NHibernate и заменены GenericPersistentBag, который не сериализуем. Вы пометили свои IEnumerable datamembers как виртуальные из-за nhibernate или чего-то подобного? это может объяснить вашу ошибку.

кстати. исключения wcf часто бывают совершенно бессмысленными (что может очень расстраивать при поиске ошибки;)

0 голосов
/ 25 октября 2010

У меня была эта ошибка при использовании 'yield return' для создания перечисления объектов, сопоставленных с моим типом DataContract.

Вызов ToList / ToArray по результатам доходности исправил проблему, и сервисный вызов работал правильно.

0 голосов
/ 13 августа 2010

Попробуйте установить [OperationBehavior()] над вашей реализацией метода интерфейса.

0 голосов
/ 23 апреля 2010

Да, у меня была такая же проблема, и дело было в возврате объектов, в которых были значения enum. Изменил DataMember на int, и все стало работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...