c# web. Занятие 03

44
Темы лекции: WCF. Практическое задание: WCF. Тренер: Игорь Шкулипа, к.т.н. Разработка Веб-приложений на платформе Microsoft .NET Framework. Занятие 3

Upload: igor-shkulipa

Post on 12-Apr-2017

100 views

Category:

Education


3 download

TRANSCRIPT

Темы лекции: WCF.

Практическое задание: WCF.

Тренер: Игорь Шкулипа, к.т.н.

Разработка Веб-приложений на платформе Microsoft .NET Framework.

Занятие 3

http://www.slideshare.net/IgorShkulipa 2

Архитектура клиент/сервер

http://www.slideshare.net/IgorShkulipa 3

Сервис-ориентированная архитектура

http://www.slideshare.net/IgorShkulipa 4

WCF

Windows Communication Foundation (WCF) ― это унифицированнаяинтегрированная среда для создания защищенных, надежных,транзакционных и интероперабельных распределенных приложений. Вболее ранних версиях Visual Studio имелись некоторые технологии, которыеможно было использовать для взаимодействия между приложениями.

До появления WCF, если достаточно было только обеспечить передачу данныхмежду клиентом и сервером, использующим ОС Windows, то использовалосьудаленное взаимодействие .NET Remoting. Если требовалось обеспечитьтранзактные коммуникации, то нужно было использовать Enterprise Services(DCOM), а если требовалось реализовать модель с организацией очереди,то нужно было использовать Message Queuing (или MSMQ).

WCF сводит воедино функциональные возможности всех этих технологий вунифицированную модель программирования. Это упрощаетвзаимодействие между разработанными распределенными приложениями.

Модель программирования WCF основана на коммуникации между двумясущностями: службой WCF и клиентом WCF. Эта модель программированияинкапсулирована в пространство имен System.ServiceModel в .NETFramework.

http://www.slideshare.net/IgorShkulipa 5

WCF

В основе работы работы WCF сервисов лежит протокол SOAP (SimpleObject Access Protocol), который работает поверх протокола HTTP ипредполагает передачу сообщений по сети в формате XML.Следовательно сервис WCF при взаимодействии с клиентом долженсначала сериализовать данные в XML, а затем передать их клиентучерез SOAP, клиент в свою очередь должен десериализоватьполученное сообщение. Соответственно, все типы данных, которые мыиспользуем в контрактах нашего сервиса должны бытьсериализуемыми.

http://www.slideshare.net/IgorShkulipa 6

Служба

В основе своей служба – это множество «оконечных точек» (endpoints),которые предоставляют клиентам некие полезные возможности.

Оконечная точка – это просто сетевой ресурс, которому можно посылатьсообщения. Чтобы воспользоваться предоставляемымивозможностями, клиент посылает сообщения оконечным точкам вформате, который описывается контрактом между клиентом ислужбой. Службы ожидают поступления сообщений на адресоконечной точки, предполагая, что сообщения будут записаны воговоренном формате.

http://www.slideshare.net/IgorShkulipa 7

Оконечные точки

Каждая служба должна предоставлять как минимум одну рабочуюоконечную точку, и каждая оконечная точка должна иметь одинконтракт. Все оконечные точки службы имеют уникальные адреса. Однаслужба может предоставлять несколько конечных точек.

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

Оконечные точки могут использовать одинаковые или разные привязки,а также предоставлять одинаковые или разные контракты.

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

http://www.slideshare.net/IgorShkulipa 8

АПК

Чтобы клиент мог передать службе осмысленную информацию, он должензнать АПК.

• «А» обозначает адрес.Адрес определяет, куда следует отправлять сообщения, чтобы

оконечная точка их получила. В случае протокола HTTP адресбудет выглядеть так: http://myserver/myservice/, а в случае TCPтак: net.tcp://myserver:8080/myservice.

• «П» обозначает привязкуПривязка определяет канал для коммуникаций с оконечной точкой.

По каналам передаются все сообщения, циркулирующие вприложении WCF. Канал состоит из нескольких элементовпривязки (binding element). На самом нижнем уровне элементпривязки – это транспортный механизм, обеспечивающийдоставку сообщений по сети. В WCF встроены следующиетранспорты: HTTP, TCP, Named Pipes, PerChannel и MSMQ.Элементы привязки, расположенные выше, описывают требованияк безопасности и транзакционной целостности. WCF поставляетсяс набором готовых привязок, в которых каналы уже собраны исконфигурированы, чтобы вы не тратили на это время.

http://www.slideshare.net/IgorShkulipa 9

АПК

• «К» обозначает контракт.Контракт определяет набор функций, предоставляемых оконечной

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

http://www.slideshare.net/IgorShkulipa 10

Адрес. Размещение служб

Для активации службы ее необходимо разместить в среде выполнения,которая создает эту службу и управляет ее контекстом и временемсуществования. Службы Windows Communication Foundation (WCF)предназначены для выполнения в любом процессе Windows, которыйподдерживает управляемый код.

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

http://www.slideshare.net/IgorShkulipa 11

Варианты размещения служб

Размещение в управляемом приложенииСлужбы WCF можно разместить в любом управляемом приложении. Это

наиболее гибкий вариант, поскольку он почти не требуетразвертывания инфраструктуры. Код службы внедряется в кодуправляемого приложения, после чего создается и открываетсяэкземпляр класса ServiceHost, чтобы служба стала доступной.

Этот вариант поддерживает два распространенных сценария: службыWCF, выполняющиеся внутри консольных приложений, ифункциональные клиентские приложения, например основанные наWindows Presentation Foundation (WPF) или формах Windows Forms(WinForms).

В качестве управляемой службы Windows (прежнее название —служба NT). Во время существования процесса, службаконтролируется диспетчером служб для служб Windows. Как и в случаерезидентного размещения, в данном случае код размещения являетсячастью приложения. Служба реализуется в качестве службы Windowsи в качестве службы WCF, в результате чего она наследует классуServiceBase и интерфейсу контракта службы WCF. Таким образом,объект ServiceHost создается и открывается с помощьюпереопределенного метода OnStart(String[]) и закрывается с помощьюпереопределенного метода OnStop().

http://www.slideshare.net/IgorShkulipa 12

Варианты размещения служб

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

Службы, размещаемые в IIS, могут использовать только транспорт HTTP.

Служба активации Windows (WAS) — это новый механизм активациипроцессов для Windows Server 2008. Она сохраняет привычную модельпроцессов IIS 6.0 (с использованием пулов приложений и активациипроцессов с помощью сообщений) и функции размещения (например,быструю отработку сбоев, мониторинг работоспособности служб и ихперезапуск), однако ее архитектура активации уже не зависит отпротокола HTTP. IIS 7.0 использует архитектуру WAS для выполненияактивации на основе сообщений по протоколу HTTP.

http://www.slideshare.net/IgorShkulipa 13

Привязки

Привязка – это набор настроек, относящихся к транспортному протоколу,коммуникационной схеме, надёжности, безопасности, распространению транзакций исовместимости.

Стандартные привязки:

• BasicHttpBinding (HTTP, HTTPS) – предоставляет WCF-клиентам доступ к старымWeb-службам .asmx

• NetTcpBinding (TCP) – для интрасетей, поддерживает надёжность, транзакции,безопасность, оптимизирована для взаимодействия WCF-WCF

• NetPeerTcpBinding (P2P) – для одноранговых сетей типа GRID

• NetNamedPipeBinding (IPC) – именованные каналы в пределах одногокомпьютера. Наиболее защищённые (не принимают вызовы от TCP),поддерживают все функции NetTcpBinding

• wsHttpBinding (HTTP, HTTPS) – для интернет сетей с поддержкой надёжности,транзакций, безопасности

• wsDualHttpBinding (HTTP, HTTPS) – в дополнение к предыдущей поддерживаетдвухстороннее взаимодействие между службой и клиентом (поддерживаетсявторой HTTP-канал для обратного вызова от службы к клиенту)

• NetMsmqBinding (MSMQ) – для поддержки очередей автономных вызовов винтрасетях

http://www.slideshare.net/IgorShkulipa 14

Контракты WCF

• Контракты служб [ServiceContract] описывают операции (методы),которые могут выполняться клиентом с помощью службы. Включаетконтракты необходимых операций [OperationContract] ;

• Контракты данных [DataContract] определяют, какие типы данныхпринимаются и передаются службой. При передаче объекта илиструктурного типа в параметре операции, в действительности, надопередать лишь его состояние, а принимающая сторона должнапреобразовать его обратно к своему родному представлению. Этоназывается маршалтинг по значению. Он реализуется посредствомсериализации, когда пользовательские типы переводятся из CLRпредставлений в XML содержимое SOAP-конвертов. При приёмепараметров происходит десериализация, т.е. набор XML преобразуетсяв объект CLR и дальше передаётся для обработки;

• Контракты ошибок [FaultContract] определяют, какие исключенияинициируются службой, как служба обрабатывает их и передаёт своимклиентам;

• Контракты сообщений [MessageContract], [MessageHeader][MessageBodyHeader] позволяют службам напрямую взаимодействоватьс сообщениями и моделировать структуру всего конверта SOAP.

http://www.slideshare.net/IgorShkulipa 15

WSDL

Чтобы контракты были интероперабельны с максимально широкимдиапазоном систем, они выражаются на языке WSDL.

WSDL – это формат XML для описания сетевых служб, представленных ввиде набора оконечных точек, выполняющих операции надсообщениями, которые содержат документо-ориентированную илипроцедурно-ориентированную информацию.

http://www.slideshare.net/IgorShkulipa 16

Контракты данных

Контракт данных — формальное соглашение между службой и клиентом,абстрактно описывающее данные, обмен которыми происходит. Этозначит, что для взаимодействия клиент и служба не обязанысовместно использовать одни и те же типы, достаточно совместноиспользовать одни и те же контракты данных. Контракт данных длякаждого параметра и возвращаемого типа четко определяет, какиеданные сериализуются в XML для обмена.

По молчанию в Windows Communication Foundation (WCF) длясериализации и десериализации данных (преобразования в XML иобратно) используется модуль сериализации, называемыйсериализатором контракта данных. Все типы-примитивы .NETFramework, такие как integer и string, а также некоторые типы,которые обрабатываются как примитивы, такие как DateTime иXmlElement, могут быть сериализованы без дополнительной обработкии считаются типами, которые по умолчанию содержат контрактыданных. Многие типы .NET Framework также содержат контрактыданных.

http://www.slideshare.net/IgorShkulipa 17

Типы, поддерживаемые сериализатором контрактов данных

• Все открытые типы, имеющие конструктор без параметров.

• Типы контрактов данных. К этим типам применен атрибутDataContractAttribute. Как правило, создавать новые пользовательскиетипы, представляющие бизнес-объекты, следует в виде типовконтрактов данных.

• Типы коллекций. Эти типы представляют списки данных. Это могутбыть обычные массивы типов или типы коллекций, например, ArrayListи Dictionary<TKey, TValue>. Для настройки сериализации таких типовможно использовать атрибут CollectionDataContractAttribute, однако этоне является обязательным.

• Типы перечисления. Перечисления, включая перечисления флагов,могут быть сериализованы. Типы перечисления также можно пометитьатрибутом DataContractAttribute. В этом случае каждый член,участвующий в сериализации, должен быть помечен атрибутомEnumMemberAttribute. Все непомеченные члены не сериализуются.

http://www.slideshare.net/IgorShkulipa 18

Типы, поддерживаемые сериализатором контрактов данных

Типы-примитивы .NET Framework. Все следующие типы, встроенные в.NET Framework, могут быть сериализованы и считаются типами-примитивами: Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64,Single, Double, Boolean, Char, Decimal, Object и String.

Другие типы-примитивы. Следующие типы не являются примитивами в.NET Framework, но обрабатываются как примитивы всериализованной форме XML: DateTime , DateTimeOffset, TimeSpan,Guid, Uri, XmlQualifiedName и массив Byte.

Типы, помеченные с помощью атрибута SerializableAttribute. В этукатегорию попадают многие типы из библиотеки базовых классов .NETFramework. Сериализатор DataContractSerializer обеспечивает полнуюподдержку этой модели программирования сериализации,используемой в удаленном взаимодействии .NET Framework вBinaryFormatter и SoapFormatter, включая поддержку интерфейсаISerializable.

http://www.slideshare.net/IgorShkulipa 19

Типы, поддерживаемые сериализатором контрактов данных

Типы, представляющие исходный XML, и типы, представляющиереляционные данные ADO.NET. Типы XmlElement и массивэлементов XmlNode поддерживаются для прямого представления XML.Кроме того, поддерживаются типы, реализующие интерфейсIXmlSerializable, включая связанный атрибутXmlSchemaProviderAttribute и типы XDocument и XElement. ТипыADO.NETDataTable и DataSet (а также его наследуемыетипизированные классы) реализуют интерфейс IXmlSerializable ипоэтому тоже попадают в эту категорию.

http://www.slideshare.net/IgorShkulipa 20

Определение контракта данных

Для сериализации новых созданных сложных типов необходимоопределить контракты данных. По умолчанию DataContractSerializerопределяет контракт данных и сериализует все открытые типы. Всеоткрытые свойства чтения/записи и поля типа сериализуются. Можноисключать члены из сериализации с помощьюIgnoreDataMemberAttribute. Также можно явно создавать контрактданных с помощью атрибутов DataContractAttribute иDataMemberAttribute. Обычно это делается с помощью примененияатрибута DataContractAttribute к типу. Данный атрибут может бытьприменен к классам, структурам и перечислениям. После этогонеобходимо применить атрибут DataMemberAttribute к каждомучлену типа контракта данных, чтобы указать, что он является членомданных, который необходимо сериализовать.

[ServiceContract]

public interface ISampleInterface {

[OperationContract]

double SquareRoot(int root);

[OperationContract]

bool ApprovePurchaseOrder(MyTypes.PurchaseOrder po);

}

http://www.slideshare.net/IgorShkulipa 21

Наследование и контрактов данныхpublic class BaseData {

public string author;

}

[DataContract]

public class MyData : BaseData {

[DataMember]

public int id;

[DataMember]

public string text;

}

Чтобы это сработало необходимо пометить класс BaseData атрибутомDataContract:

[DataContract]

public class BaseData {

public string author;

}

[DataContract]

public class MyData : BaseData {

[DataMember]

public int id;

[DataMember]

public string text;

}

http://www.slideshare.net/IgorShkulipa 22

Примеры контрактов

1. Классический вызов метода с ожиданием ответа поддерживается всеми привязками (кроме NetPeerTcpBinding и NetMsmqBinding):

[OperationContract(IsOneWay = false)]

string MyMethod(out int n1, int n2);

Возвращаемые параметры должны стоять в начале списка параметров.

2. Односторонний вызов метода поддерживается всеми привязками:

[OperationContract(IsOneWay = true)]

void MyMethod();

3. Двухсторонний (обратный) вызов поддерживается привязками NetTcpBinding, NetNamedPipeBinding, wsDualHttpBinding:

[ServiceContract(CallBackContract = typeof(ISomeBackConract)]

Обратный вызов должен специально организовываться и у клиента.

4. Поддержка сеанса в контракте для привязок TCP, IPC и WS :

[ServiceContract(SessionMode = SessionMode.Allowed]

и в поведении службы: [ServiceBehavior(InstanceContextMode =

InstanceContextMode.PerSession)]

http://www.slideshare.net/IgorShkulipa 23

Реализация службы

1. Определяем контракт

1. Размещаем службу в процессе операционной системы, чтобы клиентымогли обращаться к ней из сети. Для этого создается объекта классаServiceHost, определенного в пространстве имен System.ServiceModel,и вызывается его метод Open.

1. Создаем конфигурационный файл, в котором определяется базовыйадрес службы и АПК ее оконечной точки. Или создаем конфигурациюслужбы и оконечных точек программным способом.

http://www.slideshare.net/IgorShkulipa 24

Структура файла конфигурации служб - Web.config

<system.serviceModel> - раздел WCF

<services> - раздел настроек всех служб

<service name="MyNamespace.MyService1" Описание первой службы

behaviorConfiguration="SrvBehavior"> – имя её поведения в <behaviors>

<endpoint …> оконечная рабочая точка 1

<endpoint …> оконечная рабочая точка 2

</service>

<service name="MyNamespace.MyService2"> Описание второй службы<endpoint …> оконечная рабочая точка 1

<endpoint …> оконечная рабочая точка 2

</service>

</services>

<bindings> - раздел конфигурации привязок (при необходимости)…</bindings>

<behaviors> - раздел настроек поведения (доступ к метаданным, исключения…)

</behaviors> для различных служб и оконечных точек

</system.serviceModel>

http://www.slideshare.net/IgorShkulipa 25

Конфигурация конечных точек (адрес, привязка, контракт) для первой службы

<endpoint address="http://localhost:8000/MyService1/" - оконечная рабочая точка 1

binding="wsHttpBinding"

contract="MyNamespace.IMyContract"

name="MyPoint1"

bindingConfiguration="MyConfigNetTCP" – имя для конфигурации привязки в

<bindings>

behaviorConfiguration="PointBehavior"> – имя для поведения точки в <behavior>

<endpoint address=net.tcp://localhost:8001/MyService1/ - оконечная рабочая точка 2

binding="netTcpBinding"

contract="MyNamespace.IMyContract"

name="MyPoint2">

http://www.slideshare.net/IgorShkulipa 26

Обмен метаданными

Метаданные необходимы для создания прокси-класса у клиента черезкоторый он будет взаимодействовать со службой. Метаданные можноопубликовать двумя способами:

1. по протоколу HTTP-GET,

2. через конечную точку MEX

Оба варианта автоматически генерируются VS в файле конфигурации.config:

<!-- Metadata Endpoints -->

<!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->

<endpoint

address="mex"

binding="mexHttpBinding"

contract="IMetadataExchange" />

http://www.slideshare.net/IgorShkulipa 27

Настройка поведения behaviors

<behaviors>

<serviceBehaviors>

<behavior name="SrvBehavior">

<!-- To avoid disclosing metadata information, set the value below to false and remove

the metadata endpoint above before deployment -->

<serviceMetadata httpGetEnabled="true" />

<!-- To receive exception details in faults for debugging purposes, set the value below to true.

Set to false before deployment to avoid disclosing exception information -->

<serviceDebug includeExceptionDetailInFaults="false" />

<serviceThrottling maxConcurrentSessions="20" />

</behavior>

</serviceBehaviors>

<endpointBehaviors>

<behavior name="PointBehavior">

</behavior>

</endpointBehaviors>

</behaviors>

http://www.slideshare.net/IgorShkulipa 28

Конфигурация конечных точек на стороне клиента

<system.serviceModel>

<bindings><wsHttpBinding>

<binding name="MyPoint" closeTimeout="00:01:00“openTimeout="00:01:00" receiveTimeout="00:10:00"

sendTimeout="00:01:00"bypassProxyOnLocal="false" transactionFlow="false"

hostNameComparisonMode="StrongWildcard"maxBufferPoolSize="524288" maxReceivedMessageSize="65536"messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"allowCookies="false">

</wsHttpBinding>…

</bindings>

<client>

<endpoint name="MyPoint"

address="http://localhost:8000/MyService1/" binding="wsHttpBinding"

contract="MyNamespace.IMyPoint"

bindingConfiguration="MyPoint" >

</endpoint>

</client>

</system.serviceModel>

http://www.slideshare.net/IgorShkulipa 29

Книга

Стив Резник, Ричард Крейн, Крис БоуэнОсновы Windows Communication Foundation для .NET Framework 3.5: Пер.

с англ. Слинкина А. А. – М.: ДМК Пресс, 2008. – 480 с.:

http://www.slideshare.net/IgorShkulipa 30

Пример. Служба. Контракт данных

using ...

using System.Runtime.Serialization;

using System.ServiceModel;

using System.ServiceModel.Description;

using System.ServiceModel.Web;

namespace WCFS1

{

[DataContract(Namespace = "WCFS1")]

public class Contact

{

[DataMember]

public string Name { get; set; }

[DataMember]

public string Middle { get; set; }

[DataMember]

public string Surname { get; set; }

[DataMember]

public DateTime Birthday { get; set; }

[DataMember]

public string Address { get; set; }

[DataMember]

public string Phone { get; set; }

[DataMember]

public string Email { get; set; }

}

http://www.slideshare.net/IgorShkulipa 31

Служба. Логикаpublic class Contacts {

public Contacts() {

ContactList = new List<Contact>();

ContactList.Add(new Contact {

Name = "Ivan",

Middle = "Ivanovich",

Surname = "Ivanov",

Birthday = Convert.ToDateTime("01/01/1980"),

Address = "Ivanovo, Ivanova st., 1",

Phone = "+123 45 678 90 00",

Email = "[email protected]" });

ContactList.Add(new Contact {

Name = "Petr",

Middle = "Petrovich",

Surname = "Petrov",

Birthday = Convert.ToDateTime("02/02/1980"),

Address = "Petrovo, Petrova st., 2",

Phone = "+098 76 543 21 00",

Email = "[email protected]" });

ContactList.Add(new Contact {

Name = "Sidor",

Middle = "Sidorovich",

Surname = "Sidorov",

Birthday = Convert.ToDateTime("03/03/1980"),

Address = "Sidorovo, Sidorova st., 1",

Phone = "+765 43 210 98 76",

Email = "[email protected]" });

}

http://www.slideshare.net/IgorShkulipa 32

Служба. Логика

public List<Contact> ContactList { get; set; }

public string ContactName { get; set; }

public List<string> Names

{

get {

var result = from c in ContactList

where true

select c.Name;

return result.ToList<string>();

}

}

public Contact CurrentContact {

get {

var result = from c in ContactList

where c.Name.Equals(ContactName)

select c;

if (result.Count<Contact>() > 0)

return result.ToList<Contact>()[0];

else

return new Contact();

}

}

}

http://www.slideshare.net/IgorShkulipa 33

Служба. Контракт службы

[ServiceContract]

public interface IService1

{

[OperationContract]

List<string> GetNames();

[OperationContract]

Contact GetData(string name);

}

http://www.slideshare.net/IgorShkulipa 34

Служба. Релизация

public class Service1 : IService1

{

private Contacts conts;

public Service1()

{

conts = new Contacts();

}

public List<string> GetNames()

{

return conts.Names;

}

public Contact GetData(string name)

{

conts.ContactName = name;

return conts.CurrentContact;

}

}

http://www.slideshare.net/IgorShkulipa 35

Служба. Хостинг в консольном приложении

class Program {

static void Main(string[] args) {

ServiceHost serviceHost = new ServiceHost(typeof(Service1),

new Uri("http://localhost:45678/Service1"));

BasicHttpBinding binding = new BasicHttpBinding();

binding.MaxBufferSize = 10000;

binding.MaxReceivedMessageSize = 10000;

ServiceEndpoint ep = serviceHost.AddServiceEndpoint(typeof(IService1),

binding, "");

ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();

behavior.HttpGetEnabled = true;

serviceHost.Description.Behaviors.Add(behavior);

serviceHost.AddServiceEndpoint(

typeof(IMetadataExchange),

MetadataExchangeBindings.CreateMexHttpBinding(),

"mex");

serviceHost.Open();

Console.WriteLine("Press <ENTER> to finish.\n\n");

Console.ReadLine();

serviceHost.Close();

}

}

http://www.slideshare.net/IgorShkulipa 36

Пример. Клиент службы

http://www.slideshare.net/IgorShkulipa 37

Клиент. Контракт данных

using System.ServiceModel;

using System.ServiceModel.Web;

using System.Runtime.Serialization;

using System.ComponentModel;

namespace WCFClient

{

[DataContract(Namespace = "WCFS1")]

public class Contact

{

[DataMember]

public string Name { get; set; }

[DataMember]

public string Middle { get; set; }

[DataMember]

public string Surname { get; set; }

[DataMember]

public DateTime Birthday { get; set; }

[DataMember]

public string Address { get; set; }

[DataMember]

public string Phone { get; set; }

[DataMember]

public string Email { get; set; }

}

http://www.slideshare.net/IgorShkulipa 38

Клиент. Контракт службы

[ServiceContract]

public interface IService1

{

[OperationContract]

List<string> GetNames();

[OperationContract]

Contact GetData(string name);

}

http://www.slideshare.net/IgorShkulipa 39

Клиент. ViewModelpublic class ContactViewModel: INotifyPropertyChanged {

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string name) {

if (PropertyChanged != null) {

PropertyChanged(this, new PropertyChangedEventArgs(name));

} }

public ContactViewModel() {

Names = new List<string>();

CurrentContact = new Contact();

CurrentName = ""; }

public List<string> Names { get; set; }

public string CurrentName { get; set; }

public Contact CurrentContact { get; set; }

public string DetailsText

{

get {

return CurrentContact.Name + "\n" +

CurrentContact.Middle + "\n" +

CurrentContact.Surname + "\n" +

CurrentContact.Birthday.ToString() + "\n" +

CurrentContact.Address + "\n" +

CurrentContact.Phone + "\n" +

CurrentContact.Email + "\n";

}

}

}

http://www.slideshare.net/IgorShkulipa 40

Клиент. Окно

public partial class MainWindow : Window

{

ContactViewModel cvm;

IService1 wcfClient;

public MainWindow()

{

InitializeComponent();

cvm = new ContactViewModel();

BasicHttpBinding binding = new BasicHttpBinding();

binding.MaxBufferSize = 100000;

binding.MaxReceivedMessageSize = 100000;

ChannelFactory<IService1> myChannelFactory =

new ChannelFactory<IService1>(

binding,

new EndpointAddress

(new Uri("http://localhost:45678/Service1")));

wcfClient = myChannelFactory.CreateChannel();

cvm.Names = wcfClient.GetNames();

detailsText.DataContext = cvm;

namesList.DataContext = cvm;

namesList.SelectedIndex = 0;

}

http://www.slideshare.net/IgorShkulipa 41

Клиент. Обработчик изменения списка

private void namesList_SelectionChanged(object sender,

SelectionChangedEventArgs e)

{

cvm.CurrentName = namesList.SelectedItem.ToString();

cvm.CurrentContact =

wcfClient.GetData(cvm.CurrentName);

cvm.OnPropertyChanged("DetailsText");

}

http://www.slideshare.net/IgorShkulipa 42

Запускаем службу

http://www.slideshare.net/IgorShkulipa 43

Клиент. Результат

http://www.slideshare.net/IgorShkulipa 44

Лабораторная работа №3. WCF

Вариант 1. Создать WCF-службу для получения информации опоступивших заказах.

Вариант 2. Создать WCF-службу для индивидуального проекта.