Windows Communication Foundation Microsoft 2010 2011 WCF Windows

  • Slides: 98
Download presentation
Windows Communication Foundation (від Microsoft) 2010 -2011 WCF

Windows Communication Foundation (від Microsoft) 2010 -2011 WCF

Windows Communication Foundation (WCF) WCF 2

Windows Communication Foundation (WCF) WCF 2

Кінцеві точки WCF. Контракти. Контракт служби (Service. Contract). Приклад namespace Calc. WCF_VS 2013 {

Кінцеві точки WCF. Контракти. Контракт служби (Service. Contract). Приклад namespace Calc. WCF_VS 2013 { [Service. Contract] public interface ICalc. Service { [Operation. Contract] double Add(double a 1, double a 2); } } ICalc. Service. cs – модуль з інтерфейсом (фрагмент) Calc. Service. cs – модуль із namespace Calc. WCF_VS 2013 класом реалізації інтерфейса ICalc. Service. cs(фрагмент) { public class Calc. Service : ICalc. Service { public double Add(double a 1, double a 2){ Console. Write. Line(string. Format("Adding {0} and {1}", a 1, a 2)); return a 1 + a 2; } } } WCF 6

Прив'язки “на замовлення”. Приклади (1/2) Приклад 1. Custom. Binding custom. Binding = new Custom.

Прив'язки “на замовлення”. Приклади (1/2) Приклад 1. Custom. Binding custom. Binding = new Custom. Binding( new One. Way. Binding. Element(), //канальна форма new Text. Message. Encoding. Binding. Element(), new Http. Transport. Binding. Element() ); Поняття прив'язки можна розглядати як деякий аналог поняття стеку каналів. . . Приклад 2. Custom. Binding cust. Binding = new Custom. Binding(); cust. Binding. Elements. Add( new Binary. Message. Encoding. Binding. Element()); cust. Binding. Elements. Add( new Udp. Transport. Binding. Element()); WCF 19

Прив'язки. Конфігурування Приклад програмного конфігурування прив'язки (приклад 2 з попереднього слайду). Custom. Binding cust.

Прив'язки. Конфігурування Приклад програмного конфігурування прив'язки (приклад 2 з попереднього слайду). Custom. Binding cust. Binding = new Custom. Binding(); cust. Binding. Elements. Add( new Binary. Message. Encoding. Binding. Element()); cust. Binding. Elements. Add( new Udp. Transport. Binding. Element()); Приклад файлового конфігурування прив'язки <? xml version="1. 0" encoding="utf-8"? > <configuration> <system. service. Model> <bindings> <custom. Binding> <binding name = "Custom. Binding"> <binary. Message. Encoding/> <udp. Transport/> </binding> </custom. Binding> </bindings>. . . </system. service. Model> WCF </configuration> 20

Стандартні прив’язки (msdn) https: //msdn. microsoft. com/en-us/library/aa 738737(v=vs. 110). aspx WCF 22

Стандартні прив’язки (msdn) https: //msdn. microsoft. com/en-us/library/aa 738737(v=vs. 110). aspx WCF 22

Прив’язка basic. Http. Binding. Приклад конфігурування властивостей такої прив’язки <configuration> <system. service. Model> <bindings>

Прив’язка basic. Http. Binding. Приклад конфігурування властивостей такої прив’язки <configuration> <system. service. Model> <bindings> <basic. Http. Binding> <binding name="Basic. Http. Binding. My. Service” close. Timeout="00: 01: 00” open. Timeout="00: 01: 00” receive. Timeout="00: 10: 00" send. Timeout="00: 01: 00” max. Buffer. Size="65536" max. Buffer. Pool. Size="524288” max. Received. Message. Size="65536" message. Encoding="Text" text. Encoding="utf-8" transfer. Mode="Buffered"> </binding> </basic. Http. Binding> </bindings> <client> <endpoint address="http: //localhost: 33333/My. Service" binding="basic. Http. Binding" binding. Configuration = "Basic. Http. Binding. My. Service" contract="Service. Reference. IService" name = "Basic. Http. Binding. My. Service"/> </client> </system. service. Model> </configuration> WCF 24

Прив’язка web. Http. Binding та RESTful-служби. Приклад HTTP Get. Uri. Template db WCF table

Прив’язка web. Http. Binding та RESTful-служби. Приклад HTTP Get. Uri. Template db WCF table 28

Client. Calc. WCF_VS 2013 — клієнтський проект. Form 1. cs (фрагмент) public partial class

Client. Calc. WCF_VS 2013 — клієнтський проект. Form 1. cs (фрагмент) public partial class Form 1 : Form { Namespace Файл Form 1. cs (фрагмент) Service. Reference 1. Calc. Service. Client proxy; І’мя класу проксі public Form 1() { Initialize. Component(); proxy = new Service. Reference 1. Calc. Service. Client(); } private void button 1_Click(object sender, Event. Args e) { double a 1 = double. Parse(text. Box 1. Text); double a 2 = double. Parse(text. Box 2. Text); double result = proxy. Add(a 1, a 2); label 1. Text = "" + result; } } WCF 31

Client. Calc. WCF_VS 2013 — клієнтський проект. Файл App. config <? xml version="1. 0"

Client. Calc. WCF_VS 2013 — клієнтський проект. Файл App. config <? xml version="1. 0" encoding="utf-8" ? > <configuration> <startup> <supported. Runtime version="v 4. 0” sku=". NETFramework, Version=v 4. 5. 1" /> </startup> <system. service. Model> <bindings> <basic. Http. Binding> <binding name="Basic. Http. Binding_ICalc. Service" /> </basic. Http. Binding> </bindings> <client> <endpoint address="http: //localhost: 17209/Calc. Service. svc” binding="basic. Http. Binding" binding. Configuration="Basic. Http. Binding_ICalc. Service” contract="Service. Reference 1. ICalc. Service" name="Basic. Http. Binding_ICalc. Service" /> </client> </system. service. Model> </configuration> WCF 32

Ще одна версія Calc. Service. cs для дослідження WCF Із використанням public class Calc.

Ще одна версія Calc. Service. cs для дослідження WCF Із використанням public class Calc. Service : ICalc. Service GUID ! { private Guid m_guid; public Calc. Service() { m_guid = Guid. New. Guid(); Console. Write. Line("Calc. Service created. New GUID: {0}", m_guid. To. String()); } public double Add(double a 1, double a 2) { Console. Write. Line(string. Format( "Adding {0} and {1}; GUID is {2}", a 1, a 2, m_guid. To. String())); return a 1 + a 2; } } WCF 34

Calc. WCF. Можливості хостінгу. Модуль Program. cs using using System; System. Collections. Generic; System.

Calc. WCF. Можливості хостінгу. Модуль Program. cs using using System; System. Collections. Generic; System. Linq; System. Text; Calc. WCF – self-hosted проект System. Service. Model; Підтримка такого хостінгу пов'язується з проектом “Indigo” namespace Calc. WCF { class Program { static void Main(string[] args) { Service. Host shost = new Service. Host(typeof(Calc. Service)); shost. Open(); Console. Write. Line("Ready!"); Console. Read. Line(); shost. Close(); Console. Write. Line("Closed"); } } } WCF 35

Серверний проект Calc. WCF. Конфігураційний файл App. config (фрагмент) <service behavior. Configuration="Calc. WCF. Calc.

Серверний проект Calc. WCF. Конфігураційний файл App. config (фрагмент) <service behavior. Configuration="Calc. WCF. Calc. Service. Behavior" name="Calc. WCF. Calc. Service"> <endpoint address="" binding="ws. Http. Binding” contract="Calc. WCF. ICalc. Service"> </endpoint>. . . <host> Інтерфейс (WCF-служби) – контракт кінцевої точки (endpoint) <base. Addresses> <add base. Address= "http: //localhost: 8731/Design_Time_Addresses/Calc. WCF/Calc. Service/"/> </base. Addresses> </host> </service> Система конфігурування. Net Framework спряжена із середовищем розгортання. Якщо для IIS в якості конфігураційного файлу має виступати Web. config, то в інших випадках – App. config. WCF 36

Пригадаємо WS і зіставимо з WCF Серверний проект Calc. WCF. (7/7) Запуск проекту та

Пригадаємо WS і зіставимо з WCF Серверний проект Calc. WCF. (7/7) Запуск проекту та його відкриття у браузері App. config <endpoint address="". . . <host> <base. Addresses> <add base. Address= (фрагмент) "http: //localhost: 8731/Design_Time_Addresses/Calc. WCF/Calc. Service/"/> . . . WCF 37

Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (1/3)

Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (1/3) • По-перше, App. config містить описи двох (!) кінцевих точок WCF-служби <services> <service behavior. Configuration="Calc. WCF. Calc. Service. Behavior" name="Calc. WCF. Calc. Service"> <endpoint address="" binding="ws. Http. Binding” contract="Calc. WCF. ICalc. Service"> </endpoint> Кінцева точка метаданих <endpoint address="mex" binding="mex. Http. Binding” contract="IMetadata. Exchange" /> <host> "mex” – від Metadata. Exchange <base. Addresses> <add base. Address= "http: //localhost: 8731/Design_Time_Addresses/Calc. WCF/Calc. Service/"/> </base. Addresses> </host> </services> Файл App. config (фрагмент) WCF 40

Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (2/3)

Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (2/3) • По-друге, в App. config міститься опис спеціальної поведінки (behavior) WCF-служби <behaviors> Файл App. config (фрагмент) <service. Behaviors> <behavior name="Calc. WCF. Calc. Service. Behavior"> <service. Metadata http. Get. Enabled="true" /> </behavior> За замовчуванням (!)– ”false" </service. Behaviors> Надається можливість доступу до метаданих </behaviors> безпосередньо із браузера, використовуючи операцію GET протоколу HTTP <services> <service behavior. Configuration="Calc. WCF. Calc. Service. Behavior" name="Calc. WCF. Calc. Service"> <endpoint address="" binding="ws. Http. Binding” contract="Calc. WCF. ICalc. Service"> </endpoint> <endpoint address="mex" binding="mex. Http. Binding” contract="IMetadata. Exchange" /> WCF 41

Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (3/3)

Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (3/3) <behavior name="Calc. WCF. Calc. Service. Behavior"> <service. Metadata http. Get. Enabled="true" /> </behavior> Файл App. config (фрагменти) <service behavior. Configuration="Calc. WCF. Calc. Service. Behavior" name="Calc. WCF. Calc. Service"> <endpoint address="mex" binding="mex. Http. Binding” contract="IMetadata. Exchange" /> WCF 42

Кінцева точка доступу до метаданих служби Metadata <endpoint address="mex” binding="mex. Http. Binding” contract= "IMetadata.

Кінцева точка доступу до метаданих служби Metadata <endpoint address="mex” binding="mex. Http. Binding” contract= "IMetadata. Exchange" /> WCF 45

Клієнтський Win. Forms-проект Calc. Client. Файл app. config (фрагмент) <client> <endpoint address= "http: //localhost:

Клієнтський Win. Forms-проект Calc. Client. Файл app. config (фрагмент) <client> <endpoint address= "http: //localhost: 8731/Design_Time_Addresses/Calc. WCF/Calc. Service/" binding="ws. Http. Binding” binding. Configuration="WSHttp. Binding_ICalc. Service" contract="Calc. Ref. ICalc. Service” name="WSHttp. Binding_ICalc. Service"> </endpoint> Файл app. config (фрагмент) </client> WCF 46

- Як впливати? - Behavior! Пригадаємо… Чим забезпечується можливість доступу до метаданих служби та

- Як впливати? - Behavior! Пригадаємо… Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (3/3) <behavior name="Calc. WCF. Calc. Service. Behavior"> <service. Metadata http. Get. Enabled="true" /> </behavior> Файл App. config (фрагменти) <service behavior. Configuration="Calc. WCF. Calc. Service. Behavior" name="Calc. WCF. Calc. Service"> <endpoint address="mex" binding="mex. Http. Binding” contract="IMetadata. Exchange" /> WCF 48

Behavior (Поведінка) Behaviors Metadata <endpoint address="mex” binding ="mex. Http. Binding” contract = "IMetadata. Exchange"

Behavior (Поведінка) Behaviors Metadata <endpoint address="mex” binding ="mex. Http. Binding” contract = "IMetadata. Exchange" /> WCF 50

Приклади класів поведінки. Клас Service. Metadata. Behavior <behavior name="Calc. WCF. Calc. Service. Behavior"> <service.

Приклади класів поведінки. Клас Service. Metadata. Behavior <behavior name="Calc. WCF. Calc. Service. Behavior"> <service. Metadata http. Get. Enabled="true" /> </behavior> Файл App. config (фрагменти) <service behavior. Configuration="Calc. WCF. Calc. Service. Behavior" name="Calc. WCF. Calc. Service"> <endpoint address="mex" binding="mex. Http. Binding” contract="IMetadata. Exchange" /> Використання поведінки у програмному коді Поведінка рівня служби Service. Metadata. Behavior behavior = new Service. Metadata. Behavior(); behavior. http. Get. Enabled = true; host. Description. Behaviors. Add(behavior); WCF 51

Файл реалізації контракту Serv. cs (основні конструкції) У проекті використовується розподілена транзакція на основі

Файл реалізації контракту Serv. cs (основні конструкції) У проекті використовується розподілена транзакція на основі транзакційного потоку using System. Data. Sql. Client; using System. Transactions; . . . public class Serv : IServ { [Operation. Behavior(Transaction. Scope. Required = true, 3 Transaction. Auto. Complete = false)] [Transaction. Flow(Transaction. Flow. Option. Allowed)] Допустимий транзакційний потік public void Update(int sum) { 4 Sql. Connection sc = new Sql. Connection(@"Data Source=. SQLEXPRESS; Attach. Db. Filename=C: Users1DocumentsVisual Studio 2010. . . sc. Open(); string update. Sql = "UPDATE Bank 1 SET Count= '"+sum. To. String()+"' WHERE id='1'"; Console. Write. Line(string. Format("Service. Update({0}). ", sum. To. String())); Sql. Command Update. Cmd = new Sql. Command(update. Sql, sc); Update. Cmd. Execute. Non. Query(); } } Operation. Context. Current. Set. Transaction. Complete(); WCF 53

Клас Instance. Context. Mode та режими інстанціації (instance) або об’єктні режими • Per. Session

Клас Instance. Context. Mode та режими інстанціації (instance) або об’єктні режими • Per. Session — режим за замовчуванням; • Per. Call; • Single. Пригадаємо. Net Remoting Варіанти. Net Remoting активації: – клієнтська; – серверна з режимами: • Singleton; • Single. Call. [Service. Behavior(Instance. Context. Mode = Instance. Context. Mode. Single)] public class Calc. Service : ICalc. Service WCF Calc. Service. cs (фрагмент) 55

Приклад використання режиму Per. Session [Service. Behavior(Instance. Context. Mode = Instance. Context. Mode. Per.

Приклад використання режиму Per. Session [Service. Behavior(Instance. Context. Mode = Instance. Context. Mode. Per. Session)] public class Calc. Service : ICalc. Service. cs (фрагмент) Доданий атрибут. Проте нагадаємо, що Per. Session є режимом за замовчуванням. WCF 59

WCF. Підтримка асинхронних викликів. (2/4). Серверний проект Calc. WCF_Async. public class Calc. Async. Service

WCF. Підтримка асинхронних викликів. (2/4). Серверний проект Calc. WCF_Async. public class Calc. Async. Service : ICalc. Async. Service { Calc. Async. Service. cs public double Sub(double a 1, double a 2) (фрагмент) { Console. Write. Line(Date. Time. Now); Console. Write. Line(string. Format( "Waiting Sub {0} and {1}", a 1, a 2)); System. Threading. Thread. Sleep(10000); //для затримки! Console. Write. Line("Sub is ready"); Console. Write. Line(Date. Time. Now); return a 1 - a 2; } } WCF 61

WCF. Підтримка асинхронних викликів. (4/4). Клієнтський проект • Традиційний підхід. Net із використанням трійки:

WCF. Підтримка асинхронних викликів. (4/4). Клієнтський проект • Традиційний підхід. Net із використанням трійки: типу IAsync. Result та функцій Begin*, End*. Form 1. cs (фрагмент — методи класу форми) Метод Sub. Call. Back private void button 2_Click(object sender, Event. Args e) викликається після { завершення асинхронної double a 1 = double. Parse(text. Box 3. Text); операції double a 2 = double. Parse(text. Box 4. Text); IAsync. Result ar. Sub = proxy 2. Begin. Sub( a 1, a 2, Sub. Call. Back , proxy 2 ); } void Sub. Call. Back(IAsync. Result ar) proxy 2 зберігається { “станом” результату функції Begin. Sub double result = ((Calc. Async. Service. Client)ar. Async. State). End. Sub(ar); label 2. Text = "" + result; Form 1. cs (фрагмент). Message. Box. Show("Sub is ready"); } (Методи класу форми. ) WCF 63

Data. Contract. Приклад. (1/8). (Приклад із використанням прив’язки basic. Http. Binding) Файл App. config

Data. Contract. Приклад. (1/8). (Приклад із використанням прив’язки basic. Http. Binding) Файл App. config (фрагмент) <!-<endpoint address="" binding="ws. Http. Binding” contract="Data. Contract. Pr. IComplex. Add"> --> <endpoint address="" binding="basic. Http. Binding” contract="Data. Contract. Pr. IComplex. Add"> WCF 65

Data. Contract. Приклад. (2/8). Інтерфейс служби та Data. Contract–клас Complex. Number [Service. Contract] IComplex.

Data. Contract. Приклад. (2/8). Інтерфейс служби та Data. Contract–клас Complex. Number [Service. Contract] IComplex. Add. cs public interface IComplex. Add (фрагмент) { [Operation. Contract] Complex. Number Add(Complex. Number a, Complex. Number b); } [Data. Contract] public class Complex. Number { [Data. Member(Name = "Real. Part", Order = 0, Is. Required = true)] public double Real; [Data. Member(Name = "Imaginary. Part", Order = 1, Is. Required = true)] public double Imaginary; public Complex. Number(double re, double im) { this. Real = re; this. Imaginary = im; } } WCF 66

Data. Contract. Приклад. (3/8). Реалізація інтерфейсу служби namespace Data. Contract. Pr { public class

Data. Contract. Приклад. (3/8). Реалізація інтерфейсу служби namespace Data. Contract. Pr { public class Complex. Add : IComplex. Add { public Complex. Number Add(Complex. Number a, Complex. Number b) { return new Complex. Number(a. Real + b. Real, a. Imaginary + b. Imaginary); } } Complex. Add. cs } (фрагмент) WCF 67

Data. Contract. Приклад. (4/8). WSDL-файл служби http: //localhost: 8731/Design_Time_Addresses/Data. Contract. Pr /Complex. Add/? wsdl

Data. Contract. Приклад. (4/8). WSDL-файл служби http: //localhost: 8731/Design_Time_Addresses/Data. Contract. Pr /Complex. Add/? wsdl WCF 68

Data. Contract. Приклад. (5/8). XML Schema. Definition (xsd 2 – імпортована частина WSDL )

Data. Contract. Приклад. (5/8). XML Schema. Definition (xsd 2 – імпортована частина WSDL ) http: //localhost: 8731/Design_Time_Addresses/Data. Contract. Pr/ Complex. Add/? xsd=xsd 2 WCF 69

Data. Contract. Приклад. (6/8). Порівняння Data. Contract та XML Schema [Data. Contract] public class

Data. Contract. Приклад. (6/8). Порівняння Data. Contract та XML Schema [Data. Contract] public class Complex. Number { [Data. Member(Name = "Real. Part", Order = 0, Is. Required = true)] public double Real; [Data. Member(Name = "Imaginary. Part", Order = 1, Is. Required = true)] public double Imaginary; . . . } WCF 70

Data. Contract. Приклад. (7/8). xsd 0 – імпортована частина WSDL http: //localhost: 8731/Design_Time_Addresses/Data. Contract.

Data. Contract. Приклад. (7/8). xsd 0 – імпортована частина WSDL http: //localhost: 8731/Design_Time_Addresses/Data. Contract. Pr/ Complex. Add/? xsd=xsd 0 WCF 71

Data. Contract. Приклад. (8/8). xsd 1 – імпортована частина WSDL http: //localhost: 8731/Design_Time_Addresses/Data. Contract.

Data. Contract. Приклад. (8/8). xsd 1 – імпортована частина WSDL http: //localhost: 8731/Design_Time_Addresses/Data. Contract. Pr/ Complex. Add/? xsd=xsd 1 WCF 72

Message. Contract. Приклад. (1/3). Інтерфейс служби та класи-повідомлення [Service. Contract] IMessage. Service. cs public

Message. Contract. Приклад. (1/3). Інтерфейс служби та класи-повідомлення [Service. Contract] IMessage. Service. cs public interface IMessage. Service (фрагмент) { [Operation. Contract] Output. Message Calculate(Input. Message request); } [Message. Contract] public class Input. Message { [Message. Header] public string date_time {get; set; } [Message. Body. Member] public double a {get; set; } [Message. Body. Member] public double b {get; set; } } [Message. Contract] public class Output. Message { [Message. Header] public string date_time {get; set; } [Message. Body. Member] public double result {get; set; } WCF } 74

Message. Contract. Приклад. (2/3). Реалізація інтерфейсу служби public class Message. Service : IMessage. Service

Message. Contract. Приклад. (2/3). Реалізація інтерфейсу служби public class Message. Service : IMessage. Service { public Output. Message Calculate(Input. Message request) { Output. Message out. Message = new Output. Message(); out. Message. result = request. a + request. b; out. Message. date_time = Date. Time. Now. To. String(); return out. Message; } Message. Service. cs } (фрагмент) WCF 75

Message. Contract. Приклад. (3/3). Фрагмент клієнтського проекту private void button 1_Click(object sender, Event. Args

Message. Contract. Приклад. (3/3). Фрагмент клієнтського проекту private void button 1_Click(object sender, Event. Args e) Message. Pr. Client. cs (фрагмент) { double a 1 = double. Parse(text. Box 1. Text); double a 2 = double. Parse(text. Box 2. Text); Message. Service. Client proxy = new Message. Service. Client(); Input. Message in. Message = new Input. Message(); in. Message. a = a 1; in. Message. b = a 2; in. Message. date_time = Date. Time. Now. To. String(); Output. Message out. Message = proxy. Calculate(in. Message); label 1. Text = "" + out. Message. result + " (" + in. Message. date_time + "---"+out. Message. date_time+ ")"; } WCF 76

Фрагмент файлу-заготівки з контрактом [Service. Contract] public interface IService 1 { [Operation. Contract] string

Фрагмент файлу-заготівки з контрактом [Service. Contract] public interface IService 1 { [Operation. Contract] string Get. Data(int value); [Operation. Contract] Composite. Type Get. Data. Using. Data. Contract(Composite. Type composite); // TODO: Добавьте здесь операции служб } // Используйте контракт данных, как показано в примере ниже, // чтобы добавить составные типы к операциям служб. [Data. Contract] public class Composite. Type { bool. Value = true; string. Value = "Hello "; [Data. Member] public bool Bool. Value { get { return bool. Value; } set { bool. Value = value; } } [Data. Member] public string String. Value { get { return string. Value; } set { string. Value = value; } } WCF 86 }

Фрагмент файлу-заготівки з реалізацією контракта (інтерфейса) public class Service 1 : IService 1 {

Фрагмент файлу-заготівки з реалізацією контракта (інтерфейса) public class Service 1 : IService 1 { public string Get. Data(int value) { return string. Format("You entered: {0}", value); } public Composite. Type Get. Data. Using. Data. Contract(Composite. Type composite) { if (composite == null) { throw new Argument. Null. Exception("composite"); } if (composite. Bool. Value) { composite. String. Value += "Suffix"; } return composite; } } } WCF 87

Клієнтський тест-проект WCF MS Visual Studio 2010: автоматична генерація тестів Клієнтський тест-проект “WCF Test

Клієнтський тест-проект WCF MS Visual Studio 2010: автоматична генерація тестів Клієнтський тест-проект “WCF Test Client” public string Get. Data(int value) { return string. Format("You entered: {0}", value); } WCF 88

Тестування операції Get. Data. Using. Data. Contract Тестування Get. Data. Using. Data. Contract (вигляд

Тестування операції Get. Data. Using. Data. Contract Тестування Get. Data. Using. Data. Contract (вигляд XML-повідомлень) WCF 90