2009-10-25 2 views
0

Вкратце: попытка написать службу wcf для winform-приложения, которое вызывает хранимую процедуру на веб-сервере. До сих пор никаких проблем - моя служба не предоставляет метод «execStp (строка nameOfStoredProcedure, stpParamList ParameterList)»метод вызова в вспомогательном классе, открытый классом службы wcf

[OperationContract] 
     int execStp(string stpName, srsWcfLib.Utilities.stpParamList paramList); 

где stpParamList другого класса проведение третьего класса stpParams (который в основном держит имя/значение пару SqlParameter

для добавления параметров в список, я написал метод во втором классе

public void addParameter(string ParamName, object ParamValue) 
     { 
      this._Parameters.Add(new stpParam(ParamName, ParamValue)); 
     } 
List<stpParam> _Parameters = new List<stpParam>(); 

    [DataMember] 
    public List<stpParam> Parameters 
    { 
     get { return _Parameters; } 
     set { _Parameters = value; } 
    } 

при создании экземпляра списка класса в победу-приложение

stpParamList stpParams = new stpParamList(); 

я могу получить доступ к stpParams.Parameters, но НЕ stpParams.addParameter (name, value);

Что мне не хватает (очевидно) ...?

Спасибо, Reinhard

ответ

3

WCF приносит только по свойствам к клиенту, а не функции. Я забываю термин, который они используют, но это, по сути, просто сбрасывание свойств/полей, которое отправляется через.

Чтобы решить эту проблему, обратитесь к той же библиотеке Entity в клиенте, а в разделе «Настройка службы WCF» отметьте «ссылку на повторное использование» для этой библиотеки.

2

Эрих прибил проблему на голову: WCF является СООБЩЕНИЕ на основе транспортной системы, например. вы передадите сериализованное сообщение своего объекта. Объект на стороне сервера с любыми дополнительными функциями будет сериализован в XML или двоичный формат, отправленный по кабелю клиенту.

Клиент, однако, имеет только файл XSD (XML Schema), открытый вашей службой в его распоряжении, - он создаст класс на стороне клиента, который имеет такую ​​же «подпись данных» на проводе, то есть те же поля, одно и то же имя и тип - но он не может волшебным образом воссоздать любые функции и/или методы, которые имеют ваш серверный код. Все, что он может сделать, - десериализировать сообщение (текстовое или двоичное) обратно в представление только для данных класса.

Это не ошибка или проблема привязки - это основной выбор дизайна для WCF. Единственное соединение между клиентом и сервером - это сериализованное сообщение - все, что может быть представлено в XML-схеме. Он будет счастливо сериализовать и десериализовать данные, но он не сможет перемещать код/​​поведение. Вы - NOT Передача фактических объектов по ссылке, как при обычном вызове функции - среда выполнения WCF преобразует ваши параметры в XML и отправляет их.

Теперь, если вы управляете обоими концами провода, например. как клиент, так и сервер, есть способ обойти это, что немного нарушает принципы SOA (но это может быть полезно). Если вы заключаете контракты на обслуживание и контракты данных в отдельную сборку Contracts.dll (библиотеку классов), а затем ссылаетесь на нее как со стороны сервера, так и со стороны клиента, вы действительно можете поделиться общим типом .NET srsWcfLib.Utilities.stpParamList со всеми его функциями. Однако в этих случаях вам нужно будет немного поработать на стороне клиента и создать экземпляр своего прокси-сервера вручную в коде (вместо того, чтобы Visual Studio или svcutil создать прокси-сервер клиента для вас), так как вам нужно ссылаться на это совместно использовать контракты и использовать их типы напрямую (вместо создания клиентских классов).

Marc

+0

Отличное сообщение, спасибо за разработку! – Erich

+0

Спасибо всем за разъяснения! Как вы заметили, я новичок в WCF, но оба ответа очень помогли! Рейнхард – Reinhard

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