Основи технології Microsoft Windows Communication Foundation
Завантажити презентаціюПрезентація по слайдам:
Основи технології Microsoft Windows Communication Foundation 2010 (Курс “Інформаційні технології”) WCF - 2010
WCF як технологія, пов'язана зі службами: створенням, розгортанням, використанням служб, їх безпекою, транзакційністю, надійністю доставки повідомлень тощо. Розвиток WCF відбувається на засадах підтримки стандартів служб (зокрема, “розширених” служб – служб узгоджених зі стандартом ws-*) та забезпеченням інтероперабельності. Windows Communication Foundation (WCF) Служби складають основу сучасної глобальної розподіленої мережі, а WCF вважають найпростішим засобом їх надання та використання на платформі Microsoft. Відповідна простота досягається за рахунок інкапсуляції технології (проте не приховуванням!) у різноманітних інструментальних засобах, зокрема у MS Visual Studio. WCF - 2010
WCF-сервіс публікує колекцію кінцевих точок (Endpoints). Кожну кінцеву точку можна розглядати як портал для спілкування із клієнтськими програмами. WCF-клієнт може звертатись до однієї чи декількох кінцевих точок і також може публікувати власні кінцеві точки для прийому повідомлень від WCF-сервісів. Кінцева точка визначається наданням “алфавітної трійки ABC”: Основи архітектури WCF Address (адреса); Binding (прив'язка); Contract (контракт). WCF - 2010
Адреса кінцевої точки (Address) – це звичайна мережна адреса, де розташований відповідний портал. Прив'язка (Binding) кінцевої точки визначає, як реалізується обмін повідомленнями, зокрема, який обрано транспортний протокол (TCP, HTTP тощо), яке використовується кодування (text, binary тощо), чи використовуються засоби безпеки та ін. Контракт (Contract) кінцевої точки визначає, що складає предмет спілкування, тобто які, наприклад, можливі запити до WCF-сервісу і які можливі відповіді. Можуть використовуватись різні базові шаблони обміну повідомленнями (basic Message Exchange Patterns), наприклад, запит/відповідь, симплекс, дуплекс. (“Функціональний інтерфейс”) Кінцеві точки WCF (1/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). WCF - 2010
Можна задавати декілька кінцевих точок навіть з одним контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Наприклад, щоб забезпечити “максимально відкритий доступ” клієнтів до сервісу, можна скористатись (стандартною) прив’язкою binding=“basicHttpBinding” (ця прив’язка відповідає відомій специфікації: Web Services Interop Basic Profile 1.1 – WS-I BP1.1), а щоб досягти максимальної продуктивності міжмашинної взаємодії у корпоративній мережі на платформі .Net доцільно скористатись (стандартною) прив’язкою binding=“netTcpBinding” (ця прив’язка базується на використанні, по-перше, транспортного протоколу tcp та, по-друге, двійкового кодування). Кінцеві точки WCF (2/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). WCF - 2010
Прив’язки Прив'язка (Binding) описує комунікаційні деталі, що пов'язані з використанням служби. Поняття прив'язки можна розглядати як деякий аналог поняття стеку каналів, тобто деякої конфігурації (послідовної комбінації) каналів. (Прив'язка складається відповідно з набору елементів прив'язки.) Важливо усвідомлювати, що повідомлення служб обробляються послідовно кожним із каналів стеку. Використовуються канали двох видів: транспортні (єдиний транспортний канал розташовується “внизу” стека: при відправленні повідомлення він використовується останнім, а при прийнятті – першим) та протокольні (зокрема, вони можуть забезпечувати шифрування повідомлень, стискання, кодування тощо). WCF - 2010
Прив’язки. Варіанти транспортних каналів Можливі варіанти транспортних каналів (протоколів): HTTP; TCP; MSMQ (канал черг повідомлень згідно до технології Microsoft Message Queue; специфіка: “незв'язаний” клієнт, обмін даними односторонній); NamedPipes (іменовані канали; такий варіант забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині); Ілюстрація до пірінгової моделі PerChannel (пірінговий канал, у пірінговій архітектурі peer-to-peer – P2P кожен вузол “має рівні права”: виступає по відношенню до інших вузлів як у ролі клієнта, так і у ролі сервера). (Порівняйте з архітектурою клієнт-сервер, багаторівневою архітектурою.) WCF - 2010
Прив'язки на замовлення. Приклади (1/2) CustomBinding customBinding = new CustomBinding( new OneWayBindingElement(), //канальна форма new TextMessageEncodingBindingElement(), new HttpTransportBindingElement() ); CustomBinding custBinding = new CustomBinding(); custBinding.Elements.Add( new BinaryMessageEncodingBindingElement()); custBinding.Elements.Add( new UdpTransportBindingElement()); Приклад 1. Приклад 2. WCF - 2010
. . . Приклад 2.a. Створення прив'язки у конфігураційному файлі. CustomBinding custBinding = new CustomBinding(); custBinding.Elements.Add( new BinaryMessageEncodingBindingElement()); custBinding.Elements.Add( new UdpTransportBindingElement()); Приклад 2. Прив'язки на замовлення. Приклади (2/2) WCF - 2010
Стандартні прив’язки Можна використовувати стандартні (“готові)” прив'язки. Наведемо приклади найбільш уживаних стандартних прив'язок: basicHttpBinding; wsHttpBinding; ws2007HttpBinding; netTcpBinding; netNamedPipeBinding (забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині). WCF - 2010
Прив’язка basicHttpBinding: є сумісною зі службами ASMX та загалом зі службами WS-I BP1.1, забезпечуючи інтероперабельність гетерогенних систем; WS-I BP1.1 – cпецифікація Web Services Interop Basic Profile 1.1 (проте, загалом, не стандарт!) 2004 року, яка є результатом співпраці відомих фірм: Microsoft, IBM, BEA, ORACLE etc та спирається на стандарти SOAP 1.1, WSDL 1.1, Message Security 1.0 ); зокрема, містить вище згадуваний елемент прив'язки HttpTransportBindingElement; за замовчуванням не є безпечною (найпростіший варіант зробити прив'язку безпечною – просто задіяти протокол https: у цьому випадку для даних відбувається шифрування згідно з протоколом SSL/TLS; для протоколу http за замовчуванням використовується порт 80, а для протоколу https – порт 443) з форматом адресації (відповідно для протоколів http та https ): http://[:]/ https://[:]/ використовує загалом біля двох десятків властивостей, які можна встановлювати конфігуруванням. WCF - 2010
Прив’язка wsHttpBinding: є сумісною із так званими “розширеними” (або “просуненими”) службами, що відповідають стандартам веб-служб WS-* (чим також забезпечується інтероперабельність); прив'язкою підтримується стандарт SOAP 1.2 та підтримуються багато інших стандартів, безпосередньо пов'язаних зі специфікацією розширених служб WS-*. Зокрема, підтримуються такі канали (протоколи) інфраструктурного рівня, що забезпечують транзакційність повідомлень (стандарт WS-Atomic Transactions), надійність доставки повідомлень (стандарт WS-ReliableMessaging), підтримку безпеки повідомлень (із безпекою пов'язано півдесятка стандартів WS-*). Загальні зауваження: 1. Окрім wsHttpBinding є й інші стандартні прив'язки, що відповідають стандартам WS-* , наприклад, wsDualHttpBinding. 2. У WCF імена усіх прив'язок, призначених для реалізації інтероперабельності на основі веб-служб, мають префікс ws. WCF - 2010
Прив’язка ws2007HttpBinding: з'явилася у версії .Net Framework 3.5; є аналогічною прив'язці wsHttpBinding, проте підтримує стандарти WS-* на час виходу версії .Net Framework 3.5 – 2007 рік. WCF - 2010
Прив’язка netTcpBinding: призначена для міжмашинної взаємодії .Net додатків (тільки на платформі .Net!). використовує елемент прив'язки TcpTransportBindingElement; формат адресації: net.tcp://[:]/ (порт за замовчуванням – 808); як і для інших прив'язок, визначені властивості (загалом їх 17), які можна встановлювати конфігуруванням. Наприклад, maxConnection визначає максимальну кількість одночасних підключень із кінцевою точкою (за замовчуванням – 10), closeTimeOut – максимальне очікування закриття з'єднання (за замовчуванням – 00:01:00). WCF - 2010
MS Visual Studio 2008. WCF-проект, що генерується майстром (1/3) Створення та безпосередній запуск проекту (Ctrl+F5). Перегляд у браузері. Див. наступн. слайд WCF - 2010
MS Visual Studio 2010. WCF-проект, що генерується майстром (1/6) Генерується такий саме проект, як і у Visual Studio 2008. Так само можливий безпосередній запуск проекту (Ctrl+F5) та перегляд у браузері. WCF - 2010
Ctrl+F5 — генерується клієнтський тест-проект “WCF Test Client” MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (2/6) Див. наступн. слайд WCF MS Visual Studio 2010: автоматична генерація тестів WCF - 2010
MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (3/6) Клієнтський тест-проект “WCF Test Client” WCF - 2010
MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (4/6) Тестування GetDataUsingDataContract WCF - 2010
MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (5/6) Тестування GetDataUsingDataContract (XML-повідомлення) WCF - 2010
MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (6/6) Клієнтський конфігураційний файл WCF - 2010
У звичайний консольний проект додамо WCF -службу, скориставшись майстром: Серверний проект CalcWCF . (1/7) (Microsoft Visual Studio 2008) 3. Натиснути 2. Увести 1. Обрати WCF - 2010
Серверний проект CalcWCF . (2/7) ICalcService.cs using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace CalcWCF { // NOTE: If you change the interface name "ICalcService" here, // you must also update the reference to "ICalcService" in // App.config. [ServiceContract] public interface ICalcService { [OperationContract] void DoWork(); } } [OperationContract] double Add(double a1, double a2); Модуль ICalcService.cs з інтерфейсом (генерується майстром) Пропонується заміна! WCF - 2010
Серверний проект CalcWCF . (3/7) CalcService.cs using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace CalcWCF { // NOTE: If you change the class name "CalcService" here, you // must also update the reference to "CalcService" in App.config public class CalcService : ICalcService { public void DoWork() { } } } public double Add(double a1, double a2) { Console.WriteLine(string.Format("Adding {0} and {1}", a1, a2)); return a1 + a2; } Модуль CalcService.cs з класом реалізації (генерується майстром) Пропонується заміна! WCF - 2010
Серверний проект CalcWCF . (4/7) CalcService.cs (версія для дослідження) public class CalcService : ICalcService { private Guid m_guid; public CalcService() { m_guid = Guid.NewGuid(); Console.WriteLine("CalcService created. New GUID: {0}", m_guid.ToString()); } public double Add(double a1, double a2) { Console.WriteLine(string.Format( "Adding {0} and {1}; GUID is {2}", a1, a2, m_guid.ToString())); return a1 + a2; } } З використанням GUID ! WCF - 2010
Серверний проект CalcWCF . (5/7) Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace CalcWCF { class Program { static void Main(string[] args) { ServiceHost shost = new ServiceHost(typeof(CalcService)); shost.Open(); Console.WriteLine("Ready!"); Console.ReadLine(); shost.Close(); Console.WriteLine("Closed"); } } } Підтримка такого хостінгу пов'язується з проектом “Indigo” CalcWCF – self-hosted проект WCF - 2010
Важливий висновок: можливість отримання метаданих WCF-служб у форматі WSDL (1/2) Натиснути Пригадаємо WS і порівняємо WCF - 2010
Важливий висновок: можливість отримання метаданих WCF-служб у форматі WSDL (2/2) CalcService – і’мя класу (реалізації)WCF-служби Клас проксі (у прикладі – CalcServiceCLient) Пригадаємо WS і порівняємо WCF - 2010
По-перше, App.config містить описи двох (!) кінцевих точок WCF-служби За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері? (1/3) "mex” – від MetadataExchange Файл App.config (фрагмент) WCF - 2010
По-друге, в App.config міститься опис спеціальної поведінки (behavior) WCF-служби Забезпечується можливість доступу до метаданих безпосередньо із браузера, використовуючи операцію GET протоколу HTTP За замовчуванням – ”false" Файл App.config (фрагмент) За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері? (2/3) WCF - 2010
Доступ до метаданих служби. Альтернативний варіант Увага! Це не посилання! Файл App.config (фрагмент) Цей варіант є варіантом за замовчуванням WCF - 2010
Пригадаємо: Зауваження. Якщо служба має декілька кінцевих точок, то у кожної з них має бути унікальна адреса. Служби з кількома кінцевими точками. Зауваження Можна задавати декілька кінцевих точок навіть з одним контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Файл App.config (фрагмент) WCF - 2010
Клієнтський WinForms-проект CalcClient. (1/5) Отримання проксі (Microsoft Visual Studio 2008)
Клієнтський WinForms-проект CalcClient. (2/5) “Add Service Reference” (“Добавить ссылку на службу”) CalcService – і’мя класу (реалізації)WCF-служби Клас проксі (у прикладі – CalcServiceCLient) WCF - 2010
Клієнтський WinForms-проект CalcClient. (2/5) “Add Service Reference” (“Добавить ссылку на службу”) За лаштунками – використання утиліти svcutil.exe svcutil.exe http://localhost:8731/Design_Time_Addresses/ CalcWCF/CalcService/mex/ -app.config -genProxy.cs WCF - 2010
Клієнтський WinForms-проект CalcClient. (3/5) Модуль Reference.cs із проксі-класом (фрагмент) //------------------------------------------------------------------------------ // // Этот код создан программой. // Исполняемая версия:2.0.50727.3053 // // Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае // повторной генерации кода. // //------------------------------------------------------------------------------ namespace CalcClient.CalcRef { [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(ConfigurationName="CalcRef.ICalcService")] public interface ICalcService { [System.ServiceModel.OperationContractAttribute(Action= "http://tempuri.org/ICalcService/Add", ReplyAction="http://tempuri.org/ICalcService/AddResponse")] double Add(double a1, double a2); } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public interface ICalcServiceChannel : CalcClient.CalcRef.ICalcService, System.ServiceModel.IClientChannel { } [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public partial class CalcServiceClient : System.ServiceModel.ClientBase, CalcClient.CalcRef.ICalcService { public CalcServiceClient() { } . . . WCF - 2010
Клієнтський WinForms-проект CalcClient. (4/5) Form1.cs (фрагмент) public partial class Form1 : Form { CalcServiceClient proxy; public Form1() { InitializeComponent(); proxy = new CalcServiceClient(); } private void button1_Click(object sender, EventArgs e) { double a1 = double.Parse(textBox1.Text); double a2 = double.Parse(textBox2.Text); //CalcServiceClient proxy = new CalcServiceClient(); double result = proxy.Add(a1, a2); label1.Text = "" + result; } } Клас проксі Файл Form1.cs (фрагмент) WCF - 2010
Клієнтський WinForms-проект CalcClient. (5/5) app.config (фрагмент) Файл app.config (фрагмент) WCF - 2010
CalcService — проект із режимом PerSession ! Отже, PerSession — режим за замовчуванням. - Як впливати? - Behavior! WCF - 2010
CalcService — проект із режимом PerSession ! Отже, PerSession — режим за замовчуванням. - Як впливати? - Behavior! WCF - 2010
Behavior. Пригадаємо… За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері? (3/3)
Behavior-класи (класи поведінки ) Впливають на роботу WCF на етапі виконання, зокрема, при ініціалізації інфраструктури WCF на боці сервера або клієнта, а також у процесі передачі повідомлень (перед відправленням, та після прийняття). Їх можна розглядати як механізм розширення WCF . Наприклад, саме поведінкою визначається, чи потрібно викликаний метод включати у транзакцію, чи потрібно створювати новий екземпляр класу служби. Залежно від рівня впливу на роботу WCF іноді поділяються на типи, основними з яких є наступні три: поведінки рівня служби (впливають на всі кінцеві точки), які, зокрема, управляють створенням екземплярів, транзакціями, авторизацією тощо; поведінки рівня кінцевої точки (впливають на інспектування та обробку повідомлень служби (як вхідних, так і вихідних); поведінки рівня операції (впливають на інспектування та обробку параметрів, зокрема на їх серіалізацію). WCF - 2010
Приклади класів поведінки: класи InstanceContextMode та ConcurrencyMode InstanceContextMode є поведінкою рівня служби, що використовується для управління створенням екземплярів та може приймати одне з трьох значень: InstanceContextMode.PerCall; InstanceContextMode.PerSession; InstanceContextMode.Single. ConcurrencyMode є поведінкою рівня служби, що використовується для управління паралелізмом всередині екземпляра служби та може приймати одне з трьох значень: ConcurrencyMode. Single – до екземпляра може звертатись лише один потік (режим за замовчуванням); ConcurrencyMode.Reentrant – до екземпляра може звертатись лише один потік, але він може покидати службу, а потім до неї повертатись; ConcurrencyMode.Multiple – до екземпляра можуть звертатись кілька потоків (клас має розроблятись з урахуванням безпеки стосовно потоків). WCF - 2010
Клас InstanceContextMode та режими інстанціації (instance) або об’єктні режими PerCall — режим за замовчуванням; PerSession; Single. Варіанти .Net Remoting активації: клієнтська; серверна з режимами: Singleton; SingleCall. [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class CalcService : ICalcService CalcService.cs (фрагмент) Пригадаємо .Net Remoting WCF - 2010
Приклад використання режиму Single CalcService.cs (фрагмент) [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class CalcService : ICalcService Доданий атрибут. (Це єдина відмінність порівняно з базовою версією серверного проекту!) WCF - 2010
Режим PerSession Режим PerSession має ту особливість, що підтримується не всіма зв’язуваннями (binding), зокрема не підтримується такими стандартними зв’язуваннями, як BasicHttpBinding, NetPeerTcpBinding. Відповідно у контракті рекомендується інформувати про необхідність підтримки сессій. [ServiceContract] public interface ICalcService ICalcService.cs (фрагмент) [ServiceContract(SessionMode = SessionMode.Required)] Рекомендована заміна WCF - 2010
Приклад використання режиму PerSession CalcService.cs (фрагмент) [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class CalcService : ICalcService Доданий атрибут. WCF - 2010
Приклад Клієнтський проект звертається до двох схожих за функціональністю сервісів (з інтерфейсними методами Add та Sub відповідно), але один з них використовує асинхронні виклики (а саме для Sub). WCF. Підтримка асинхронних викликів (1/4) WCF - 2010
WCF. Підтримка асинхронних функцій (2/4) Серверний проект CalcWCF_Async. CalcAsyncService.cs (фрагмент) public class CalcAsyncService : ICalcAsyncService { public double Sub(double a1, double a2) { Console.WriteLine(DateTime.Now); Console.WriteLine(string.Format("Waiting Sub {0} and {1}", a1, a2)); System.Threading.Thread.Sleep(10000); Console.WriteLine("Sub is ready"); Console.WriteLine(DateTime.Now); return a1 - a2; } } WCF - 2010
WCF. Підтримка асинхронних функцій (3/4) Клієнтський проект: отримання проксі Для SvcUtil – прапорець /async WCF - 2010
WCF. Підтримка асинхронних функцій (4/4) Клієнтський проект Традиційний підхід .Net з використанням трійки: типу IAsyncResult та функцій Begin*, End*. (Об’єкти-делегати) private void button2_Click(object sender, EventArgs e) { double a1 = double.Parse(textBox3.Text); double a2 = double.Parse(textBox4.Text); IAsyncResult arSub = proxy2.BeginSub( a1, a2, SubCallBack , proxy2 ); } void SubCallBack(IAsyncResult ar) { double result = ((CalcAsyncServiceClient)ar.AsyncState).EndSub(ar); label2.Text = "" + result; MessageBox.Show("Sub is ready"); } Form1.cs (фрагмент). (Методи класу форми.) Метод SubCallBack викликається після завершення асинхронної операції (делегат) Form1.cs (фрагмент — методи класу форми) Делегат proxy2 зберігається “станом” WCF - 2010
DataContract Контракти про дані (DataContract): задають структури даних (як даних CLR-типів), що використовуються при взаємодії служби із клієнтськими програмами; визначають відображення даних CLR-типів у дані-повідомлення SOAP–протоколу, структура яких визначається з використанням нотації XML SchemaDefinition (XSD); зокрема, уточнюється, яким чином буде здійснюватись серіалізація даних CLR-типів та спряжена десеріалізація: атрибутом [DataMember] відмічаються ті члени класу, що підлягають серіалізації. Визначення імен і порядку слідування компонент WCF - 2010
DataContract. Приклад (2/8). Інтерфейс служби та DataContract–клас ComplexNumber [ServiceContract] public interface IComplexAdd { [OperationContract] ComplexNumber Add(ComplexNumber a, ComplexNumber b); } [DataContract] public class ComplexNumber { [DataMember(Name = "RealPart", Order = 0, IsRequired = true)] public double Real; [DataMember(Name = "ImaginaryPart", Order = 1, IsRequired = true)] public double Imaginary; public ComplexNumber(double re, double im) { this.Real = re; this.Imaginary = im; } } IComplexAdd.cs (фрагмент) WCF - 2010
DataContract. Приклад (3/8). Реалізація інтерфейсу служби namespace DataContractPr { public class ComplexAdd : IComplexAdd { public ComplexNumber Add(ComplexNumber a, ComplexNumber b) { return new ComplexNumber(a.Real + b.Real, a.Imaginary + b.Imaginary); } } } ComplexAdd.cs (фрагмент) WCF - 2010
DataContract. Приклад (4/8). WSDL-файл служби http://localhost:8731/Design_Time_Addresses/DataContractPr/ComplexAdd/?wsdl WCF - 2010
DataContract. Приклад (5/8). XML SchemaDefinition (xsd2 – імпортована частина WSDL ) http://localhost:8731/Design_Time_Addresses/DataContractPr/ ComplexAdd/?xsd=xsd2 WCF - 2010
DataContract. Приклад (6/8). Порівняння DataContract та XML Schema [DataContract] public class ComplexNumber { [DataMember(Name = "RealPart", Order = 0, IsRequired = true)] public double Real; [DataMember(Name = "ImaginaryPart", Order = 1, IsRequired = true)] public double Imaginary; . . . } WCF - 2010
DataContract. Приклад (7/8). xsd0 – імпортована частина WSDL http://localhost:8731/Design_Time_Addresses/DataContractPr/ ComplexAdd/?xsd=xsd0 WCF - 2010
DataContract. Приклад (8/8). xsd1 – імпортована частина WSDL http://localhost:8731/Design_Time_Addresses/DataContractPr/ ComplexAdd/?xsd=xsd1 WCF - 2010
MessageContract Контракти про повідомлення (MessageContract) задають відображення даних CLR-типів у дані-повідомлення – повідомлення протоколу SOAP. Важливо, що контракти про повідомлення надають можливість безпосередньо контролювати склад заголовку (header) і тіла (body) SOAP–повідомлення, а також спростити маніпулювання заголовком, тілом та їх складовими частинами. WCF - 2010
MessageContract. Приклад (1/3). Інтерфейс служби та класи-повідомлення [ServiceContract] public interface IMessageService { [OperationContract] OutputMessage Calculate(InputMessage request); } [MessageContract] public class InputMessage { [MessageHeader] public string date_time {get; set;} [MessageBodyMember] public double a {get; set;} [MessageBodyMember] public double b {get; set;} } [MessageContract] public class OutputMessage { [MessageHeader] public string date_time {get; set;} [MessageBodyMember] public double result {get; set;} } IMessageService.cs (фрагмент) WCF - 2010
MessageContract. Приклад (2/3) Реалізація інтерфейсу служби public class MessageService : IMessageService { public OutputMessage Calculate(InputMessage request) { OutputMessage outMessage = new OutputMessage(); outMessage.result = request.a + request.b; outMessage.date_time = DateTime.Now.ToString(); return outMessage; } } MessageService.cs (фрагмент) WCF - 2010
MessageContract. Приклад (3/3) Фрагмент клієнтського проекту private void button1_Click(object sender, EventArgs e) { double a1 = double.Parse(textBox1.Text); double a2 = double.Parse(textBox2.Text); MessageServiceClient proxy = new MessageServiceClient(); InputMessage inMessage = new InputMessage(); inMessage.a = a1; inMessage.b = a2; inMessage.date_time = DateTime.Now.ToString(); OutputMessage outMessage = proxy.Calculate(inMessage); label1.Text = "" + outMessage.result + " (" + inMessage.date_time + "---"+outMessage.date_time+ ")"; } MessagePrClient.cs (фрагмент) WCF - 2010
Додавання WCF -служби у консольний проект: Microsoft Visual Studio 2010. Склад серверного проекту, що генерується майстром 3. Натиснути 2. Увести 1. Обрати Склад проекту WCF - 2010
Схожі презентації
Категорії