Программирование >>  Программирование с использованием ajax 

1 ... 375 376 377 [ 378 ] 379 380 381 ... 396


I ! : /€:/BegVCSharyChapter35/Ch35Ex0l/ChSSFxOIС1. п!Л) п/1)еЬи..


Puc. 35.4. Приложение ChSSExO 1Сlient в действии

13. Просмотрите информацию на Web-странице, которая появится в окне браузера, как показано на рис. 35.5.

9 Strvicti Servtc*

Гй 8wvicel 8imce

Servicel Service I

- .Реве -

You have created a serve

To left this lervic*. rou will need to create a client and use to саИ the serv.ce You cao do th. using the svcutil e e tool from the command line w*h thf toHowmg ynta :

evcutll.exe http:, icx-U.oat:S47J/8<cvtT<: .- ач.

This will generate a conigurabon hke and a code hi tnat contains the cWent class Add two W s to rour client apphcetion and use he generated client dass to call the Service For e.ample

ec tic void HainO (

Setvic lCient ciienc - uen 3-iviel UeotO;

им Che client verifUJle to cell овгвчопд ou the seivicc.

JLiwars eioaa cbe client. cllant.CloMO ;

% Local Mranet Protected Mode: On

Puc. 35.5. Просмотр информации в окне браузера

14. Щелкните на ссылке в верхней части этой представляющей службу Web-страницы, чтобы отобразить содержимое файла WSDL. Беспокоиться не следует: знать, что обозначает все содержимое в файле WSDL, вовсе не обязательно.

Описание полученных результатов

в этом примере мы создали простую WCF-службу с Web-сервером в качестве хоста и клиентское консольное приложение для нее. Для создания проекта WCF-службы применялся стандартный шаблон WS, благодаря чему не потребовалось добавлять никакого кода. Вместо этого мы воспользовались одной из определенных в этом стандартном шаблоне операций, а именно - GetData (). Для целей данного примера сама операция не важна; вместо нее больше интересует структура кода и внутренние детали, которые позволяют ему работать.

Сначала давайте взглянем на проект сервера - Ch35Ex01. Ниже описан его состав.

□ Файл Servicel .svc, в котором определяются связанные с хостингом детали службы.

□ Определение класса CompositeType, в котором определяется используемый службой контракт данных.



□ Определение интерфейса IServicel, в котором определяется контракт службы и два контракта операций для службы.

□ Определение класса Servicel, в котором реализуется интерфейс IServicel и определяется функциональность службы.

□ Конфигурационный раздел <system. serviceModel> (в файле Web.config), в котором осуществляется конфигурирование службы.

В файле Servicel. SVC содержится следующая строка кода (чтобы увидеть ее, щелкните правой кнопкой мыши на этом файле в окне Solution Explorer и выберите в контекстном меню пункт View Markup (Просмотреть разметку)):

<%@ ServiceHost Language= C# Debug= true Service= Ch35Ex01.Servicel CodeBehind= Servicel.svc.cs %>

Она представляет собой инструкцию ServiceHost, которая используется для указания Web-серверу (в данном случае Web-серверу разработки, хотя это также распространяется и на сервер IIS), хостинг какой службы должен обеспечиваться по данному адресу. В атрибуте Service объявляется класс, в котором содержится определение службы, а в атрибуте CodeBehind- файл кода, в котором хранится определение самого этого класса. Наличие такой инструкции является необходимым для получения тех предоставляемых посредством хостинга возможностей Web-сервера, о которых рассказывалось в предыдущем разделе.

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

Далее определяется контракт данных CompositeType в файле IServicel. cs. В коде видно, что контракт данных представляет собой просто определение класса, в котором определение самого класса сопровождается атрибутом DataContract, а определения его членов - атрибутом DataMember:

[DataContract]

public class CompositeType

bool boolValue = true;

string stringValue = Hello ;

[DataMember]

public bool BoolValue

get { return boolValue; } set { boolValue = value; }

[DataMember]

public string StringValue {

get { return stringValue; } set { StringValue = value; }

Этот контракт данных предоставляется клиентскому приложению через метаданные (если вы просмотрели содержимое файла WSDL, как указывалось в примере, то наверняка заметили это). Это позволяет клиентским приложениям определять тип, допускающий сериализацию в такую форму, из которой служба сможет преобразовать его обратно посредством десериализации в объект CompositeType. Клиенту не нужно знать, как в действительности выглядит определение данного типа; на самом деле в



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

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

Наконец-то мы дошли и до конфигурации в файле Web. conf ig. Конфигурирование WCF-служб в конфигурационных файлах представляет собой возможность, которая была позаимствована из .NET-технологии удаленного бзаимодействия и подходит как

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

Еще в файле IServicel .cs содержится контракт службы, представляющий собой определение интерфейса с атрибутом ServiceContract. Этот интерфейс, опять-таки, полностью описывается в метаданных службы и может воссоздаваться в клиентских приложениях. Члены этого интерфейса образуют предоставляемые службой операции, и каждый из них используется для создания соответствующего контракта операции путем применения атрибута OperationContract. В коде данного примера присутствуют две операции, в одной из которых используется рассматривавшийся выше контракт данных:

[ServiceContract]

public interface IServicel

[OperationContract] string GetData(int value);

[OperationContract]

CompositeType GetDataUsingDataContract(CompositeType composite);

Bee четыре атрибута для определения контрактов, которые встречались до сих пор, могут конфигурироваться далее с помощью других соответствующих атрибутов; как именно - будет показываться в следующем разделе. Код, реализующий службу, выглядит во многом так же, как и определение любого другого класса:

public class Servicel : IServicel {

public string GetData(int value) {

return string.Format ( You entered: {0} , value);

public CompositeType GetDataUsingDataContract(CompositeType composite) {

if (composite.BoolValue) {

composite.StringValue += Suffix ;

return composite;



1 ... 375 376 377 [ 378 ] 379 380 381 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика