Microsoft Windows Communication Foundation 2010 WCF 2010 WCF

  • Slides: 79
Download presentation
Основи технології Microsoft Windows Communication Foundation (Курс “Інформаційні технології”) 2010 WCF - 2010

Основи технології Microsoft Windows Communication Foundation (Курс “Інформаційні технології”) 2010 WCF - 2010

WCF - 2010 2

WCF - 2010 2

Прив'язки на замовлення. Приклади (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 - 2010 9

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

Прив'язки на замовлення. Приклади (2/2) Приклад 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()); Приклад 2. a. Створення прив'язки у конфігураційному файлі. <? 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 - 2010 </configuration> 10

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

Прив’язка 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 - 2010 13

MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (4/6) Тестування Get. Data. Using.

MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (4/6) Тестування Get. Data. Using. Data. Contract WCF - 2010 23

Серверний проект Calc. WCF. (2/7) ICalc. Service. cs using using System; System. Collections. Generic;

Серверний проект Calc. WCF. (2/7) ICalc. Service. cs using using System; System. Collections. Generic; System. Linq; System. Runtime. Serialization; System. Service. Model; System. Text; Модуль ICalc. Service. cs з інтерфейсом (генерується майстром) namespace Calc. WCF { // NOTE: If you change the interface name "ICalc. Service" here, // you must also update the reference to "ICalc. Service" in // App. config. [Service. Contract] public interface ICalc. Service { [Operation. Contract] void Do. Work(); } } Пропонується заміна! [Operation. Contract] double Add(double a 1, double a 2); WCF - 2010 28

Серверний проект Calc. WCF. (3/7) Calc. Service. cs using using System; System. Collections. Generic;

Серверний проект Calc. WCF. (3/7) Calc. Service. cs using using System; System. Collections. Generic; System. Linq; System. Runtime. Serialization; System. Service. Model; System. Text; Модуль Calc. Service. cs з класом реалізації (генерується майстром) namespace Calc. WCF { // NOTE: If you change the class name "Calc. Service" here, you // must also update the reference to "Calc. Service" in App. config public class Calc. Service : ICalc. Service { public void Do. Work() { } } } 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 - 2010 29

Серверний проект Calc. WCF. (4/7) Calc. Service. cs (версія для дослідження) З використанням public

Серверний проект Calc. WCF. (4/7) Calc. Service. cs (версія для дослідження) З використанням 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 - 2010 30

Серверний проект Calc. WCF. (5/7) Program. cs using using System; System. Collections. Generic; System.

Серверний проект Calc. WCF. (5/7) 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 - 2010 31

Серверний проект Calc. WCF. (6/7) App. config (фрагмент) <service behavior. Configuration="Calc. WCF. Calc. Service.

Серверний проект Calc. WCF. (6/7) 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. У Visual Studio на основі App. config створюється (з автоматичною підтримкою змін) кінцевий файл конфігурації у вигляді : «ім'я збірки» . exe. config. WCF - 2010 32

Серверний проект Calc. WCF. (7/7) Маленька перевірка у браузері Пригадаємо WS і порівняємо <endpoint

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

За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері?

За рахунок чого забезпечується доступ до метаданих служби та отримання її 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 - 2010 36

За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері?

За рахунок чого забезпечується доступ до метаданих служби та отримання її 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 - 2010 37

За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері?

За рахунок чого забезпечується доступ до метаданих служби та отримання її 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 - 2010 38

Доступ до метаданих служби. Альтернативний варіант Цей варіант є варіантом за замовчуванням Файл App.

Доступ до метаданих служби. Альтернативний варіант Цей варіант є варіантом за замовчуванням Файл App. config (фрагмент) <service. Metadata http. Get. Enabled = ”false" /> <endpoint address="mex" binding="mex. Http. Binding” contract="IMetadata. Exchange" /> <base. Addresses> <add base. Address= Увага! Це не посилання! WCF - 2010 "http: //localhost: 8731/Design_Time_Addresses/Calc. WCF/Calc. Service/" /> </base. Addresses> Файл App. config (фрагмент) 39

Доступ до метаданих служби Metadata <endpoint address="mex” binding="mex. Http. Binding” contract= "IMetadata. Exchange" />

Доступ до метаданих служби Metadata <endpoint address="mex” binding="mex. Http. Binding” contract= "IMetadata. Exchange" /> WCF - 2010 41

Клієнтський Win. Forms-проект Calc. Client. (1/5) Отримання проксі (Microsoft Visual Studio 2008) <endpoint address="".

Клієнтський Win. Forms-проект Calc. Client. (1/5) Отримання проксі (Microsoft Visual Studio 2008) <endpoint address="". . . <host> <base. Addresses> <add base. Address= "http: //localhost: 8731/Design_Time_Addresses/Calc. WCF/Calc. Service/"/> . . . 2. Увести 3. Натиснути 1. Обрати 4. Обрати 6. Натиснути 5. Увести WCF - 2010 42

Клієнтський Win. Forms-проект Calc. Client. (2/5) “Add Service Reference” (“Добавить ссылку на службу”) За

Клієнтський Win. Forms-проект Calc. Client. (2/5) “Add Service Reference” (“Добавить ссылку на службу”) За лаштунками – використання утиліти svcutil. exe http: //localhost: 8731/Design_Time_Addresses/ Calc. WCF/Calc. Service/mex/ -app. config -gen. Proxy. cs WCF - 2010 44

Клієнтський Win. Forms-проект Calc. Client. (3/5) Модуль Reference. cs із проксі-класом (фрагмент) //---------------------------------------// <auto-generated>

Клієнтський Win. Forms-проект Calc. Client. (3/5) Модуль Reference. cs із проксі-класом (фрагмент) //---------------------------------------// <auto-generated> // Этот код создан программой. // Исполняемая версия: 2. 0. 50727. 3053 // // Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае // повторной генерации кода. // </auto-generated> //--------------------------------------- namespace Calc. Client. Calc. Ref { [System. Code. Dom. Compiler. Generated. Code. Attribute("System. Service. Model", "3. 0. 0. 0")] [System. Service. Model. Service. Contract. Attribute(Configuration. Name="Calc. Ref. ICalc. Service")] public interface ICalc. Service { [System. Service. Model. Operation. Contract. Attribute(Action= "http: //tempuri. org/ICalc. Service/Add", Reply. Action="http: //tempuri. org/ICalc. Service/Add. Response")] double Add(double a 1, double a 2); } [System. Code. Dom. Compiler. Generated. Code. Attribute("System. Service. Model", "3. 0. 0. 0")] public interface ICalc. Service. Channel : Calc. Client. Calc. Ref. ICalc. Service, System. Service. Model. IClient. Channel { } [System. Diagnostics. Debugger. Step. Through. Attribute()] [System. Code. Dom. Compiler. Generated. Code. Attribute("System. Service. Model", "3. 0. 0. 0")] public partial class Calc. Service. Client : System. Service. Model. Client. Base<Calc. Client. Calc. Ref. ICalc. Service>, Calc. Client. Calc. Ref. ICalc. Service {. . . public Calc. Service. Client() { } WCF - 2010 45

Клієнтський Win. Forms-проект Calc. Client. (4/5) Form 1. cs (фрагмент) public partial class Form

Клієнтський Win. Forms-проект Calc. Client. (4/5) Form 1. cs (фрагмент) public partial class Form 1 : Form { Файл Form 1. cs (фрагмент) Calc. Service. Client proxy; Клас проксі public Form 1() { Initialize. Component(); proxy = new 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); //Calc. Service. Client proxy = new Calc. Service. Client(); double result = proxy. Add(a 1, a 2); label 1. Text = "" + result; } } WCF - 2010 46

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

Клієнтський Win. Forms-проект Calc. Client. (5/5) 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 - 2010 47

Behavior. Пригадаємо… За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису

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 - 2010 50

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 - 2010 52

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

Приклади класів поведінки. Клас service. Metadata (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 - 2010 53

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

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

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 - 2010 60

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 ); } proxy 2 void Sub. Call. Back(IAsync. Result ar) зберігається { “станом” 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 - 2010 62

Data. Contract. Приклад (1/8). Використання прив’язки basic. Http. Binding Файл App. config (фрагмент) <!-<endpoint

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 - 2010 64

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

Data. Contract. Приклад (2/8). Інтерфейс служби та Data. Contract–клас Complex. Number IComplex. Add. cs [Service. Contract] (фрагмент) 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 - 2010 65

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 - 2010 66

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 - 2010 67

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 - 2010 68

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 - 2010 69

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 - 2010 70

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 - 2010 71

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; WCF set; } - 2010 } 73

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 - 2010 74

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 - 2010 75

Проекти • 2008/Calc. WCF - 2010 79

Проекти • 2008/Calc. WCF - 2010 79