Добавление ссылки на службу WCF также добавляет типы DataContract - PullRequest
3 голосов
/ 14 марта 2010

Я использовал функцию Add Service Reference для Visual Studio, чтобы добавить службу (на самом деле это служба рабочего процесса, созданная в WF4 RC1, но я не думаю, что это имеет какое-либо значение), и она также добавила DataContracts, что Сервис использует. Сначала это казалось нормальным, потому что все, что я имел в DataContracts, было просто свойствами, без реализаций. Но теперь я добавил код в конструктор одного контракта данных, который инициализирует, создает экземпляр одного из свойств, который предоставляет список других контроллеров домена, и когда я обновил ссылку на службу через VS (2010 RC1), реализация не был обновлен.

Что мне делать? Должен ли я использовать свои DC вместо созданных VS или я должен использовать созданные VS? Я заметил, что свойства в DC-сгенерированных DC содержат некоторую дополнительную логику для проверки равенства в установщиках, и они также реализуют некоторые интерфейсы (такие как IExtensibleDataObject и INotifyPropertyChanged), которые могут пригодиться, я думаю, в будущем (я не знающий в WCF).

Спасибо за ваше время, ребята, Avi

Ответы [ 2 ]

6 голосов
/ 14 марта 2010

Да, именно так оно и работает - и это действительно единственный способ, которым он может работать, если подумать об этом, когда у вас есть отдельная автономная служба.

Если вы контролируете оба конца провода, например, вы пишете и сервис, и клиент, конечно, вы можете сделать еще несколько вещей:

  • вы можете поместить все ваши контракты на обслуживание и данные в отдельную сборку, MyContracts, а затем добавить ссылку на эту сборку как на стороне службы, так и на стороне клиента

  • когда вы сделаете это, Visual Studio не будет заново создавать те типы, которые он обнаружит в указанной сборке, а будет просто использовать эти

Но вы должны быть предельно осторожны: Контракт с данными должен содержать только данные , а не какое-либо поведение! Поэтому будьте предельно осторожны, чтобы не помещать какие-либо вещи, основанные на поведении, в ваши DataContracts. Сообщение, передаваемое между клиентом и службой в WCF, представляет собой чисто текстовое сериализованное сообщение - вы не можете действительно передать какой-либо код между ними - имейте это в виду!

1 голос
/ 19 марта 2010

marc_s , Как я могу создать эту отдельную сборку "MyContracts", если мой клиент находится в Silverlight? Я, конечно, не могу создать эту сборку как .NET, потому что в этом случае невозможно ссылаться на нее из моего проекта SL. Да, я могу создать эту сборку как « SL Библиотека классов» и даже ссылаться на нее из своего проекта WCF, но тогда я не могу выполнить «Обновить ссылку на службу» в Studio! Я получаю сообщение об ошибке "Не удалось загрузить файл или сборку" System.Runtime.Serialization, версия = 2.0.5.0, Culture = нейтральный, PublicKeyToken = 7cec85d7bea7798e 'или одна из его зависимостей. Система не может найти указанный файл ". Обратите внимание, что v.2.0.5.0 является версией SILVERLIGHT этой DLL, а не .NET! Кажется, что эта DLL нужна для понимания атрибутов DataContract / DataMember, присутствующих в сборке «MyContracts». Если я помещу эту DLL на сервер (на котором размещены мои службы WCF) - проблема исчезнет, ​​но вместо этого появится другая проблема с теми службами, которые не используют сборку «MyContracts» и содержат DataContracts прямо внутри себя: «Тип» ... » не может быть сериализовано. Подумайте о том, чтобы пометить его атрибутом DataContractAttribute и пометить все его элементы, которые вы хотите сериализовать, атрибутом DataMemberAttribute. Другие поддерживаемые типы см. в документации Microsoft .NET Framework " Кажется, что он не может понять, какой System.Runtime.Serialization.dll использовать - SL или .NET. Есть идеи?!

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