Подтвердить что ты не робот

Сложные типы данных в WCF?

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

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

псевдокод:

Person:
IEnumerable<Order>

Order:
IEnumerable<OrderLine>

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

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

EDIT (более подробное описание ошибки):

[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.

4b9b3361

Ответ 1

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

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

Config Editor (делает его легким для настройки).

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

Ответ 2

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

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

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

Ответ 3

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

ObjectContext.ContextOptions.LazyLoadingEnabled = false;
ObjectContext.ContextOptions.ProxyCreationEnabled = false;

Ответ 4

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

<httpRuntime maxRequestLength="102400" executionTimeout="3600" />

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

попробовали ли вы использовать другие методы (простой helloworld(), например,) на одной и той же службе, чтобы убедиться, что сама конфигурация службы работает? этот вид exceptino также может указывать на некоторые проблемы сериализации. какие типы вы хотите отправить по проводам? вы используете KnownType где-нибудь?

Ответ 9

Server Error in '/' Application.
--------------------------------------------------------------------------------

An existing connection was forcibly closed by the remote host 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[SocketException (0x2746): An existing connection was forcibly closed by the remote host]
   System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) +93
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +119

[IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.]
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +267
   System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) +25
   System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) +306

[WebException: The underlying connection was closed: An unexpected error occurred on a receive.]
   System.Net.HttpWebRequest.GetResponse() +1532114
   System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +40

[CommunicationException: An error occurred while receiving the HTTP response to http://Zzzstrukturservice.xxx.dk/ZzzstrukturService.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.]
   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +2668969
   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +717
   xxx.Services.ZzzstrukturServiceClient.ZzzstrukturServiceProxy.IZzzstrukturService.GetMatrixSet(Int32 matrixSetId) +0
   xxx.Services.ZzzstrukturServiceClient.ZzzstrukturRepository.GetMatrixSetById(Int32 matrixSetId) in f:\ccnet\work\xxx.Zzzstruktur\1. Presentation Layer\ZzzstrukturServiceClient\ZzzstrukturRepository.cs:90
   xxx.yyy.yyyWeb.AnnoncePage.OnLoad(EventArgs e) in f:\ccnet\work\yyyV2\1. Presentation Layer\yyyWeb\Annonce.aspx.cs:40
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433 

Ответ 10

Я не знаю, почему это может произойти. но у меня также были подобные проблемы.

Я изменил свой enums.remove индексы (например, ASNOrder = 1, → ASNOrder,), и никаких ошибок не было.

Ответ 11

Не возвращайте литерал IEnumerable в контракте, существует знаменитая ошибка WCF IEnumerable

Ответ 12

Да, у меня была такая же проблема, и это было todo с возвращающими объектами, в которых были значения перечисления. Изменен DataMember на int и все работает statrted.

Ответ 13

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

Ответ 14

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

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