Windows Communication Foundation
Завантажити презентаціюПрезентація по слайдам:
WCF як технологія, пов'язана зі службами: створенням, розгортанням, використанням служб, їх безпекою, транзакційністю, надійністю доставки повідомлень тощо. Розвиток WCF відбувається на засадах підтримки стандартів служб (зокрема, “розширених” служб – служб узгоджених зі стандартом ws-*) та забезпеченням інтероперабельності. Windows Communication Foundation (WCF) Служби складають основу сучасної глобальної розподіленої мережі, а WCF вважають найпростішим засобом їх надання та використання на платформі Microsoft. Відповідна простота досягається за рахунок інкапсуляції технології (проте не приховуванням!) у різноманітних інструментальних засобах, зокрема у MS Visual Studio. WCF
WCF-сервіс публікує колекцію кінцевих точок (Endpoints). Кожну кінцеву точку можна розглядати як портал для спілкування із клієнтськими програмами. WCF-клієнт може звертатись до однієї чи декількох кінцевих точок і також може публікувати власні кінцеві точки для прийому повідомлень від WCF-сервісів. Кінцева точка визначається наданням “алфавітної трійки ABC”: Основи архітектури WCF Address (адреса); Binding (прив'язка); Contract (контракт). WCF
Адреса кінцевої точки (Address) – це звичайна мережна адреса, де розташований відповідний портал. Прив'язка (Binding) кінцевої точки визначає, як реалізується обмін повідомленнями, зокрема, який обрано транспортний протокол (TCP, HTTP тощо), яке використовується кодування (text, binary тощо), чи використовуються засоби безпеки та ін. Контракт (Contract) кінцевої точки визначає, що складає предмет спілкування, тобто які, наприклад, можливі запити до WCF-сервісу і які можливі відповіді. Можуть використовуватись різні базові шаблони обміну повідомленнями (basic Message Exchange Patterns), наприклад, запит/відповідь, симплекс, дуплекс. (“Функціональний інтерфейс”) Кінцеві точки WCF (1/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). WCF
Можна задавати декілька кінцевих точок навіть з одним і тим самим контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Наприклад, щоб забезпечити “максимально відкритий доступ” клієнтів до сервісу, можна скористатись (стандартною) прив’язкою binding=“basicHttpBinding” (ця прив’язка відповідає відомій специфікації: Web Services Interop Basic Profile 1.1 – WS-I BP1.1), а щоб досягти максимальної продуктивності міжмашинної взаємодії у корпоративній мережі на платформі .Net доцільно скористатись (стандартною) прив’язкою binding=“netTcpBinding” (ця прив’язка базується на використанні, по-перше, транспортного протоколу tcp та, по-друге, двійкового кодування). Кінцеві точки WCF (2/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). WCF
... можна скористатись (стандартною) прив’язкою binding=“basicHttpBinding” (ця прив’язка відповідає відомій специфікації: Web Services Interop Basic Profile 1.1 – WS-I BP1.1) До специфікації веб-сервісів Web-service Interoperability Organization (http://www.ws-i.org). До складу зазначеної організації входять: Microsoft, IBM, Sun, Oracle, Bea Systems, HP etc. Загалом розроблено вже більше 50 специфікацій так званих розширених веб-сервісів (ws-*). WCF
Прив’язки Прив'язка (Binding) описує комунікаційні деталі, що пов'язані з використанням служби. Поняття прив'язки можна розглядати як деякий аналог поняття стеку каналів, тобто деякої конфігурації (послідовної комбінації) каналів. (Прив'язка складається відповідно з набору елементів прив'язки.) Важливо усвідомлювати, що повідомлення служб обробляються послідовно кожним із каналів стеку. Використовуються канали двох видів: транспортні (єдиний транспортний канал розташовується “внизу” стека: при відправленні повідомлення він використовується останнім, а при прийнятті – першим) та протокольні (зокрема, вони можуть забезпечувати шифрування повідомлень, стискання, кодування тощо). WCF
Прив’язки. Варіанти транспортних каналів Можливі варіанти транспортних каналів (протоколів): HTTP; TCP; MSMQ (канал черг повідомлень згідно до технології Microsoft Message Queue; специфіка: “незв'язаний” клієнт, обмін даними односторонній); NamedPipes (іменовані канали; такий варіант забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині); Ілюстрація до пірінгової моделі PerChannel (пірінговий канал, у пірінговій архітектурі peer-to-peer – P2P кожен вузол “має рівні права”: виступає по відношенню до інших вузлів як у ролі клієнта, так і у ролі сервера). (Порівняйте з архітектурою клієнт-сервер.) WCF
Прив'язки на замовлення. Приклади (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
. . . Приклад файлового конфігурування прив'язки Приклад програмного конфігурування прив'язки (приклад 2 з попереднього слайду). Прив'язки. Конфігурування CustomBinding custBinding = new CustomBinding(); custBinding.Elements.Add( new BinaryMessageEncodingBindingElement()); custBinding.Elements.Add( new UdpTransportBindingElement()); WCF
Стандартні прив’язки Можна використовувати стандартні (“готові)” прив'язки. Наведемо приклади найбільш уживаних стандартних прив'язок: basicHttpBinding; wsHttpBinding; ws2007HttpBinding; webHttpBinding; netTcpBinding; netNamedPipeBinding (забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині). WCF
Прив’язка 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
Прив’язка wsHttpBinding: є сумісною із так званими “розширеними” службами, що відповідають стандартам веб-служб ws-* (чим забезпечується, зрозуміло, інтероперабельність); прив'язкою підтримується стандарт SOAP 1.2 та підтримуються багато інших стандартів, безпосередньо пов'язаних зі специфікацією розширених служб ws-*. Зокрема, підтримуються такі канали (протоколи) інфраструктурного рівня, що забезпечують транзакційність повідомлень (стандарт WS-Atomic Transactions), надійність доставки повідомлень (стандарт WS-ReliableMessaging), підтримку безпеки повідомлень (із безпекою пов'язано півдесятка стандартів ws-*). Загальні зауваження: 1. Окрім wsHttpBinding є й інші стандартні прив'язки, що відповідають стандартам ws-* , наприклад, wsDualHttpBinding. 2. У WCF імена усіх прив'язок, призначених для реалізації інтероперабельності на основі веб-служб, мають префікс ws. WCF
Прив’язка ws2007HttpBinding: з'явилася у версії .Net Framework 3.5; є аналогічною прив'язці wsHttpBinding, проте підтримує стандарти ws-* на час виходу версії .Net Framework 3.5 – 2007 рік. WCF
Прив’язка webHttpBinding: є сумісною із RESTful-службами. Презентація “WCF REST (RESTful -служби із використанням WCF)” WCF
Прив’язка netTcpBinding: призначена для міжмашинної взаємодії .Net додатків (тільки на платформі .Net !). використовує елемент прив'язки TcpTransportBindingElement; формат адресації: net.tcp://[:]/ (порт за замовчуванням – 808); як і для інших прив'язок, визначено властивості (загалом їх 17), які можна встановлювати конфігуруванням. Наприклад, maxConnection визначає максимальну кількість одночасних підключень із кінцевою точкою (за замовчуванням – 10), closeTimeOut – максимальне очікування закриття з'єднання (за замовчуванням – 00:01:00). WCF
Створення проекту та його запуск Створення проекту та його запуск (Ctrl+F5). Відкриття у браузері. ПКМ Дивись наступний слайд WCF
Створення проекту та його запуск Як і у Visual Studio 2008, можливий запуск проекту та відкриття у браузері. Окрім цього можна генерувати клієнтський тест-проект (з іменем “WCF Test Client”) WCF
Ctrl+F5 — генерується клієнтський тест-проект “WCF Test Client” Клієнтський тест-проект WCF MS Visual Studio 2010: автоматична генерація тест-проекту Файл-заготівка з реалізацією контракта (інтерфейса) WCF
Фрагмент файлу-заготівки з контрактом [ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: Добавьте здесь операции служб } // Используйте контракт данных, как показано в примере ниже, // чтобы добавить составные типы к операциям служб. [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } } WCF
Фрагмент файлу-заготівки з реалізацією контракта (інтерфейса) public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } } } WCF
Клієнтський тест-проект WCF MS Visual Studio 2010: автоматична генерація тестів Клієнтський тест-проект “WCF Test Client” public string GetData(int value) { return string.Format("You entered: {0}", value); } WCF
Клієнтський тест-проект. Тестування операції GetDataUsingDataContract Тестування операції GetDataUsingDataContract WCF
Тестування операції GetDataUsingDataContract Тестування GetDataUsingDataContract (вигляд XML-повідомлень) WCF
Клієнтський конфігураційний файл Клієнтський тест-проект. Вигляд конфігураційного файлу WCF
У звичайний консольний проект додамо WCF -службу, скориставшись майстром: Створення серверного проекту CalcWCF . (1/7) (Microsoft Visual Studio 2008) 3. Натиснути 2. Увести 1. Обрати WCF
Серверний проект 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
Серверний проект 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 – модуль із класом реалізації інтерфейса ICalcService.cs (генерується майстром) Пропонується заміна! WCF
Серверний проект CalcWCF . (4/7) Ще одна версія CalcService.cs (версія для дослідження WCF) 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
Серверний проект 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
До можливості отримання метаданих WCF-служби у форматі WSDL (1/2) Натиснути Пригадаємо WS і порівняємо WCF
До можливості отримання метаданих WCF-служби у форматі WSDL (2/2) CalcService – ім'я класу (реалізації) WCF-служби Клас проксі (у прикладі – CalcServiceCLient) Пригадаємо WS і порівняємо WCF
По-перше, App.config містить описи двох (!) кінцевих точок WCF-служби Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (1/3) "mex” – від MetadataExchange Файл App.config (фрагмент) Кінцева точка метаданих WCF
По-друге, в App.config міститься опис спеціальної поведінки (behavior) WCF-служби Надається можливість доступу до метаданих безпосередньо із браузера, використовуючи операцію GET протоколу HTTP За замовчуванням (!)– ”false" Файл App.config (фрагмент) Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (2/3) WCF
Пригадаємо: Зауваження. Якщо служба має декілька кінцевих точок, то у кожної з них має бути унікальна адреса. Служби з кількома кінцевими точками. Зауваження Можна задавати декілька кінцевих точок навіть з одним і тим самим контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Файл App.config (фрагмент) + WCF
Клієнтський WinForms-проект CalcClient. (1/5) Отримання проксі (Microsoft Visual Studio 2008)
Клієнтський 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
Клієнтський 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
Клієнтський 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
Клієнтський WinForms-проект CalcClient. (5/5) app.config (фрагмент) Файл app.config (фрагмент) WCF
CalcService — проект із режимом PerSession ! Отже, PerSession — режим за замовчуванням. - Як впливати? - Behavior! WCF
Behavior. Пригадаємо… Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (3/3)
Behavior- класи (класи поведінки ) Впливають на роботу WCF на етапі виконання, зокрема, при ініціалізації інфраструктури WCF на боці сервера або клієнта, а також у процесі передачі повідомлень (перед відправленням та після прийняття). Їх можна розглядати як механізм розширення WCF . Наприклад, саме поведінкою визначається, чи потрібно викликаний метод включати у транзакцію, чи потрібно створювати новий екземпляр класу служби. Залежно від рівня впливу на роботу WCF іноді поділяються на типи, основними з яких є наступні три: поведінки рівня служби (впливають на всі кінцеві точки), які, зокрема, управляють створенням екземплярів, транзакціями, авторизацією тощо; поведінки рівня кінцевої точки (впливають на інспектування та обробку повідомлень служби як вхідних, так і вихідних); поведінки рівня операції (впливають на інспектування та обробку параметрів, зокрема, на їх серіалізацію). WCF
Приклади класів поведінки. Клас OperationBehavior Поведінка рівня операції Приклад із презентації “WCF. Використання транзакцій (для служб ws-*)” WCF
Файл реалізації контракту Serv.cs (основні конструкції) using System.Data.SqlClient; using System.Transactions; . . . public class Serv : IServ { [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = false)] [TransactionFlow(TransactionFlowOption.Allowed)] public void Update(int sum) { SqlConnection sc = new SqlConnection(@"Data Source=.\SQLEXPRESS; AttachDbFilename=C:\Users\1\Documents\Visual Studio 2010\. . . sc.Open(); string updateSql = "UPDATE Bank1 SET Count= '"+sum.ToString()+"' WHERE id='1'"; Console.WriteLine(string.Format("Service.Update({0}).", sum.ToString())); SqlCommand UpdateCmd = new SqlCommand(updateSql, sc); UpdateCmd.ExecuteNonQuery(); OperationContext.Current.SetTransactionComplete(); } } Допустимий транзакційний потік У проекті використовується розподілена транзакція на основі транзакційного потоку 3 4 WCF
Приклади класів поведінки: класи InstanceContextMode та ConcurrencyMode InstanceContextMode є поведінкою рівня служби, що використовується для управління створенням екземплярів та може приймати одне з трьох значень: InstanceContextMode.PerCall; InstanceContextMode.PerSession; InstanceContextMode.Single. ConcurrencyMode є поведінкою рівня служби, що використовується для управління паралелізмом усередині екземпляра служби та може приймати одне з трьох значень: ConcurrencyMode. Single – до екземпляра може звертатись лише один потік (режим за замовчуванням); ConcurrencyMode.Reentrant – до екземпляра може звертатись лише один потік, але він може покидати службу, а потім до неї повертатись; ConcurrencyMode.Multiple – до екземпляра можуть звертатись кілька потоків (клас має розроблятись з урахуванням безпеки стосовно потоків). WCF
Клас InstanceContextMode та режими інстанціації (instance) або об’єктні режими PerSession — режим за замовчуванням; PerCall; Single. Варіанти .Net Remoting активації: клієнтська; серверна з режимами: Singleton; SingleCall. [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class CalcService : ICalcService CalcService.cs (фрагмент) Пригадаємо .Net Remoting WCF
Приклад використання режиму Single CalcService.cs (фрагмент) [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class CalcService : ICalcService Доданий атрибут. (Це єдина відмінність порівняно з базовою версією серверного проекту!) WCF
Приклад використання режиму PerCall CalcService.cs (фрагмент) [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class CalcService : ICalcService Доданий атрибут. (Це єдина відмінність порівняно з базовою версією серверного проекту!) WCF
Режим PerSession Режим PerSession має ту особливість, що підтримується не всіма зв’язуваннями (binding), зокрема не підтримується такими стандартними зв’язуваннями, як BasicHttpBinding, NetPeerTcpBinding. Відповідно у контракті рекомендується інформувати про необхідність підтримки сессій. [ServiceContract] public interface ICalcService ICalcService.cs (фрагмент) [ServiceContract(SessionMode = SessionMode.Required)] Рекомендована заміна WCF
Приклад використання режиму PerSession CalcService.cs (фрагмент) [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class CalcService : ICalcService Доданий атрибут. Проте нагадаємо, що PerSession є режимом за замовчуванням. WCF
Приклад Клієнтський проект звертається до двох схожих за функціональністю сервісів (з інтерфейсними методами Add та Sub відповідно), при тому один з них (а саме з методом Sub) використовує асинхронні виклики. WCF. Підтримка асинхронних викликів (1/4) WCF
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
WCF. Підтримка асинхронних функцій (3/4) Клієнтський проект: отримання проксі Для SvcUtil – прапорець /async WCF
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 зберігається “станом” результату функції BeginSub WCF
DataContract Контракти про дані (DataContract): задають структури даних (як даних CLR-типів), що використовуються при взаємодії служби із клієнтськими програмами; визначають відображення даних CLR-типів у дані-повідомлення SOAP–протоколу, структура яких визначається з використанням нотації XML SchemaDefinition (XSD); зокрема, уточнюється, яким чином буде здійснюватись серіалізація даних CLR-типів та спряжена десеріалізація: атрибутом [DataMember] відмічаються ті члени класу, що підлягають серіалізації. Визначення імен і порядку слідування компонент WCF
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
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
DataContract. Приклад (4/8). WSDL-файл служби http://localhost:8731/Design_Time_Addresses/DataContractPr/ComplexAdd/?wsdl WCF
DataContract. Приклад (5/8). XML SchemaDefinition (xsd2 – імпортована частина WSDL ) http://localhost:8731/Design_Time_Addresses/DataContractPr/ ComplexAdd/?xsd=xsd2 WCF
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
DataContract. Приклад (7/8). xsd0 – імпортована частина WSDL http://localhost:8731/Design_Time_Addresses/DataContractPr/ ComplexAdd/?xsd=xsd0 WCF
DataContract. Приклад (8/8). xsd1 – імпортована частина WSDL http://localhost:8731/Design_Time_Addresses/DataContractPr/ ComplexAdd/?xsd=xsd1 WCF
MessageContract Контракти про повідомлення (MessageContract) задають відображення даних CLR-типів у дані-повідомлення – повідомлення протоколу SOAP. Важливо, що контракти про повідомлення надають можливість безпосередньо контролювати склад заголовку (header) і тіла (body) SOAP–повідомлення, а також спростити маніпулювання заголовком, тілом та їх складовими частинами. WCF
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
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
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
Додавання WCF -служби у консольний проект: Microsoft Visual Studio 2010. Склад серверного проекту, що генерується майстром 3. Натиснути 2. Увести 1. Обрати Склад проекту WCF
Схожі презентації
Категорії