2012-04-30 1 views
2

У меня есть три программы в распределенной системе, которые полагаются на службы WCF для связи. Если у меня есть тип данных, используемый в библиотеке служб WCF, как мне получить доступ к нему от клиента, который ссылается на эту услугу?Как совместно использовать объект между WCF-сервисом и клиентом?

Я могу создать объекты, определенные в службе WCF, из приложения клиентской консоли, хотя я не могу с этим поделать. Я не могу получить доступ к каким-либо элементам или полям объекта.

К примеру, у меня есть объект класса Transaction, который используется в библиотеке сервиса и клиента:

[DataContract] 
public class Transaction 
{ 
    public int checkoutID; 
    public DateTime time; 
    public List<object> products; 
    public double totalPrice; 
    public bool complete; 

    [OperationBehavior] 
    public void Start(int ID) 
    { 
     checkoutID = ID; 
     products = new List<object>(); 
     complete = false; 
    } 

    [OperationBehavior] 
    public void Complete() 
    { 
     time = DateTime.Now; 
     complete = true; 
    } 
} 

Это берется из файла интерфейса для службы (IService), где определен другой класс, называется CompositeType. Что мне не хватает? Я думал, что службы WCF позволяют удалять методы и типы данных?

Спасибо всем, кто может помочь, у меня были проблемы с WCF какое-то время.

+0

Я добавил DLL для используемой службы, которая определяет класс Transaction, однако служба не может принимать хост, поскольку она не может сериализовать класс. Как включить его для сериализации? – Lee

ответ

0

Я не могу полностью понять ваш вопрос, но из приведенного выше кода вы делитесь методами с клиентом WCF, а не с полями/свойствами. Вам также необходимо применить атрибут [DataMember] в полях.

+0

Я являюсь tyring, чтобы получить клиент и службу, чтобы иметь возможность использовать объект, который я определил как Transaction, который имеет свои собственные поля и методы. – Lee

0

Добавить тег [DataMember] в поля - они затем сериализованы.

Кроме того, [OperationContract] должно быть по методам, а не [OperationBehavior]

7

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

То, что проходит через провод между клиентом и сервером, в основном представляет собой XML-сериализованное представление ваших объектов контракта данных. Но WCF по умолчанию не использует кодовые контракты (например, не типы данных/классы, а только их представление XML).

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

Если вы управляете обоими концами связи - сервером и клиентом - и оба используются.NET, вы можете сделать это:

  • положить службы и данные контракты в отдельную сборку (YourService.Contracts или что-то подобное)

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

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

  • В этом случае при создании прокси-сервера на стороне клиента (с использованиемили инструмента командной строки svcutil) среда выполнения WCF обнаружит, что она знает о тех типах, которые уже необходимы (поскольку они определены в общей сборке) , и это будет повторно использовать те общие типы вместо создания новых классов данных только на стороне клиента.

+0

Спасибо за ваш ответ. Раньше я был на этом пути. У меня был класс Transaction в DLL, на который клиент и служба ссылались локально, однако я никогда не мог заставить службу работать, потому что он продолжал сообщать, что класс транзакции не может быть сериализован, когда служба пыталась выполнить. Если я это сделаю, мне нужно также объявить поля и методы класса транзакций в файле интерфейса службы? – Lee

+0

@Lee: ну, во-первых - 'Transaction' - очень плохое имя - он используется .NET и T-SQL повсюду. Я бы попытался использовать что-то более содержательное. Так что, может быть, ваш сервис просто поднял неправильный класс? Класс .NET 'Transactions' вместо вашего собственного? –

+0

Я понимаю это, я его изменю. Однако, используя библиотеки DLL, клиент хотел иметь собственное пространство имен. Транзакция, как и сервер. Они никогда не соглашались с фактическим пространством имен DLL. Транзакция, если вы видите, что я говорю? – Lee

 Смежные вопросы

  • Нет связанных вопросов^_^