По умолчанию и по замыслу WCF будет совместно использовать контракты между клиентом и сервером, например, вашими службами ([ServiceContract]
), их методами ([OperationContract]
) и структурами данных, с которыми они работают ([DataContract]
).
WCF - это система передачи сообщений, поэтому все клиентские и серверные ресурсы с точки зрения передаваемых данных представляют собой сериализованный формат сообщений XML.Когда вы добавляете ссылку на службу, прокси на стороне клиента будет генерировать класс для каждого [DataContract]
, который будет выглядеть идентично в сериализованном формате XML - только данные перемещаются назад и вперед - без поведения (нетметоды).
По сути, если вы хотите раскрыть функциональность , вам нужно иметь метод обслуживания, украшенный атрибутом [OperationContract]
.Методы в ваших классах данных никогда не будут видны клиенту - и это специально.
Если вы управляете обоими сторонами связи, и оба они основаны на .NET, вы можете "обмануть"Чтобы обойти это ограничение:
- поместите все ваши контракты на обслуживание и данные в отдельную сборку библиотеки классов
- используйте ссылку на эту общую общую сборку для создания вашего сервиса
- до вы делаете
Add Service Reference
, добавьте ссылку на эту общую сборку на вашем клиенте
В этом случае среда выполнения WCF будет повторно использовать существующие типы из этой общейсборка, а не воссоздание их из описания сервиса.И поскольку эта сборка содержит общий код, который также использует сервер, ваши классы также имеют свои методы.
Он работает нормально в сценарии только .NET, но это действительно своего рода подвох за надлежащим сервисомразделительный фасад.