1 / 79

Основи технології Microsoft Windows Communication Foundation

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

bardia
Download Presentation

Основи технології Microsoft Windows Communication Foundation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. WCF - 2010

  3. Windows Communication Foundation (WCF) • WCF як технологія, пов'язана зі службами: створенням, розгортанням, використанням служб, їх безпекою, транзакційністю, надійністю доставки повідомлень тощо. • Розвиток WCF відбуваєтьсяна засадах підтримки стандартів служб (зокрема, “розширених” служб – служб узгоджених зі стандартом ws-*) та забезпеченням інтероперабельності. Служби складають основу сучасної глобальної розподіленої мережі, а WCF вважають найпростішим засобом їх надання та використання на платформі Microsoft. Відповідна простота досягається за рахунок інкапсуляції технології (проте не приховуванням!) у різноманітних інструментальних засобах, зокрема у MS Visual Studio. WCF - 2010

  4. Основи архітектури WCF • WCF-сервіс публікує колекцію кінцевих точок (Endpoints). Кожну кінцеву точку можна розглядати як портал для спілкування із клієнтськими програмами. • WCF-клієнт може звертатись до однієї чи декількох кінцевих точок і також може публікувати власні кінцеві точки для прийому повідомлень від WCF-сервісів. • Кінцева точка визначається наданням “алфавітної трійки ABC”: • Address(адреса); • Binding(прив'язка); • Contract(контракт). WCF - 2010

  5. Кінцеві точки WCF (1/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). • Адреса кінцевої точки (Address) – це звичайна мережна адреса, де розташований відповідний портал. • Прив'язка (Binding) кінцевої точки визначає, як реалізується обмін повідомленнями, зокрема, який обрано транспортний протокол (TCP, HTTP тощо), яке використовується кодування (text, binary тощо), чи використовуються засоби безпеки та ін. • Контракт (Contract) кінцевої точки визначає, що складає предмет спілкування, тобто які, наприклад, можливі запити до WCF-сервісу і які можливі відповіді. Можуть використовуватись різні базові шаблони обміну повідомленнями (basic Message Exchange Patterns), наприклад, запит/відповідь, симплекс, дуплекс. (“Функціональний інтерфейс”) WCF - 2010

  6. Кінцеві точки WCF (2/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). Можна задавати декілька кінцевих точок навіть з одним контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Наприклад, щоб забезпечити “максимально відкритий доступ” клієнтів до сервісу, можна скористатись (стандартною) прив’язкою binding=“basicHttpBinding”(ця прив’язка відповідає відомій специфікації: Web Services InteropBasic Profile 1.1 – WS-I BP1.1), а щоб досягти максимальної продуктивності міжмашинної взаємодії у корпоративній мережі на платформі .Netдоцільно скористатись (стандартною) прив’язкоюbinding=“netTcpBinding”(ця прив’язка базується на використанні, по-перше, транспортного протоколу tcp та, по-друге, двійкового кодування). WCF - 2010

  7. Прив’язки Прив'язка (Binding) описує комунікаційні деталі, що пов'язані з використанням служби. Поняття прив'язки можна розглядати як деякий аналог поняття стеку каналів, тобто деякої конфігурації (послідовної комбінації) каналів. (Прив'язка складається відповідно з набору елементів прив'язки.) Важливо усвідомлювати, що повідомлення служб обробляються послідовно кожним із каналів стеку. Використовуються канали двох видів: транспортні (єдиний транспортний канал розташовується “внизу” стека: при відправленні повідомлення він використовується останнім, а при прийнятті – першим) та протокольні (зокрема, вони можуть забезпечувати шифрування повідомлень, стискання, кодування тощо). WCF - 2010

  8. Прив’язки. Варіанти транспортних каналів Можливі варіанти транспортних каналів (протоколів): • HTTP; • TCP; • MSMQ (канал черг повідомлень згідно до технології Microsoft Message Queue; специфіка: “незв'язаний” клієнт, обмін даними односторонній); • NamedPipes (іменовані канали; такий варіант забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині); • PerChannel (пірінговий канал, у пірінговій архітектурі peer-to-peer – P2P кожен вузол “має рівні права”: виступає по відношенню до інших вузлів як у ролі клієнта, так і у ролі сервера). (Порівняйте з архітектурою клієнт-сервер, багаторівневою архітектурою.) WCF - 2010 Ілюстрація до пірінгової моделі

  9. Прив'язки на замовлення. Приклади (1/2) Приклад 1. CustomBinding customBinding = new CustomBinding( new OneWayBindingElement(), //канальна форма new TextMessageEncodingBindingElement(), new HttpTransportBindingElement() ); Приклад 2. CustomBinding custBinding = new CustomBinding(); custBinding.Elements.Add( new BinaryMessageEncodingBindingElement()); custBinding.Elements.Add( new UdpTransportBindingElement()); WCF - 2010

  10. Прив'язки на замовлення. Приклади (2/2) Приклад 2. CustomBinding custBinding = new CustomBinding(); custBinding.Elements.Add( new BinaryMessageEncodingBindingElement()); custBinding.Elements.Add( new UdpTransportBindingElement()); Приклад 2.a. Створення прив'язки у конфігураційному файлі. <?xmlversion="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <bindings> <customBinding> <bindingname = "CustomBinding"> <binaryMessageEncoding/> <udpTransport/> </binding> </customBinding> </bindings> . . . </system.serviceModel> </configuration> WCF - 2010

  11. Стандартні прив’язки Можна використовувати стандартні (“готові)” прив'язки. Наведемо приклади найбільш уживаних стандартних прив'язок: • basicHttpBinding; • wsHttpBinding; • ws2007HttpBinding; • netTcpBinding; • netNamedPipeBinding (забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині). WCF - 2010

  12. Прив’язка basicHttpBinding: • є сумісною зі службами ASMX та загалом зі службами WS-I BP1.1, забезпечуючи інтероперабельність гетерогенних систем; WS-I BP1.1– cпецифікація Web Services InteropBasic 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

  13. Прив’язка basicHttpBinding. Приклад конфігурування прив’язки <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <bindingname="BasicHttpBindingMyService”closeTimeout="00:01:00” openTimeout="00:01:00”receiveTimeout="00:10:00" sendTimeout="00:01:00”maxBufferSize="65536" maxBufferPoolSize="524288”maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"> </binding> </basicHttpBinding> </bindings> <client> <endpointaddress="http://localhost:33333/MyService" binding="basicHttpBinding" bindingConfiguration = "BasicHttpBindingMyService" contract="ServiceReference.IService" name = "BasicHttpBindingMyService"/> </client> </system.serviceModel> </configuration> WCF - 2010

  14. Прив’язка wsHttpBinding: • є сумісною із так званими “розширеними” (або “просуненими”) службами, що відповідають стандартам веб-служб WS-* (чим такожзабезпечується інтероперабельність); • прив'язкою підтримується стандарт SOAP 1.2 та підтримуються багато інших стандартів, безпосередньо пов'язаних зі специфікацією розширених служб WS-*. Зокрема, підтримуються такі канали (протоколи) інфраструктурного рівня, що забезпечують транзакційність повідомлень (стандарт WS-Atomic Transactions), надійність доставки повідомлень (стандарт WS-ReliableMessaging), підтримку безпеки повідомлень (із безпекою пов'язано півдесятка стандартів WS-*). Загальні зауваження: 1. Окрім wsHttpBinding є й інші стандартні прив'язки, що відповідають стандартам WS-* , наприклад, wsDualHttpBinding. 2. У WCFімена усіх прив'язок, призначених для реалізації інтероперабельності на основі веб-служб, мають префікс ws. WCF - 2010

  15. Прив’язка ws2007HttpBinding: • з'явилася у версії .Net Framework 3.5; • є аналогічною прив'язці wsHttpBinding, проте підтримує стандарти WS-* на час виходу версії .Net Framework 3.5 – 2007 рік. WCF - 2010

  16. Прив’язка netTcpBinding: • призначена для міжмашинної взаємодії .Net додатків (тільки на платформі .Net!). • використовує елемент прив'язки TcpTransportBindingElement; • формат адресації: net.tcp://<хост>[:<порт>]/<служба>(порт за замовчуванням – 808); • як і для інших прив'язок, визначені властивості (загалом їх 17), які можна встановлювати конфігуруванням. Наприклад, maxConnection визначає максимальну кількість одночасних підключень із кінцевою точкою (за замовчуванням – 10), closeTimeOut – максимальне очікування закриття з'єднання (за замовчуванням – 00:01:00). WCF - 2010

  17. MS Visual Studio 2008. WCF-проект, що генерується майстром (1/3) • Створення та безпосередній запуск проекту (Ctrl+F5). • Перегляд у браузері. Див. наступн. слайд WCF - 2010

  18. MS Visual Studio 2008. WCF-проект, що генерується майстром (2/3) WCF - 2010

  19. MS Visual Studio 2008. WCF-проект, що генерується майстром (3/3) Проксі-клас WCF - 2010

  20. MS Visual Studio 2010. WCF-проект, що генерується майстром (1/6) • Генерується такий саме проект, як і у Visual Studio 2008. • Так само можливий безпосередній запуск проекту (Ctrl+F5) та перегляд у браузері. WCF - 2010

  21. MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (2/6) WCF MS Visual Studio 2010: автоматична генерація тестів Ctrl+F5 — генерується клієнтський тест-проект “WCF Test Client” Див. наступн. слайд WCF - 2010

  22. MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (3/6) Клієнтський тест-проект “WCF Test Client” WCF - 2010

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

  24. MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (5/6) Тестування GetDataUsingDataContract (XML-повідомлення) WCF - 2010

  25. MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (6/6) Клієнтський конфігураційний файл WCF - 2010

  26. WCF. Демонстраційний приклад WCF - 2010

  27. Серверний проект CalcWCF . (1/7)(Microsoft Visual Studio 2008) У звичайний консольний проект додамо WCF -службу, скориставшись майстром: 1. Обрати 2. Увести 3. Натиснути WCF - 2010

  28. Серверний проект CalcWCF . (2/7)ICalcService.cs Модуль 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); WCF - 2010

  29. Серверний проект 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() { } } } Модуль CalcService.csз класом реалізації(генерується майстром) public double Add(double a1, double a2) { Console.WriteLine(string.Format("Adding {0} and {1}", a1, a2)); return a1 + a2; } Пропонується заміна! WCF - 2010

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

  31. Серверний проект 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"); } } } CalcWCF – self-hostedпроект Підтримка такого хостінгу пов'язується з проектом “Indigo” WCF - 2010

  32. Серверний проект CalcWCF . (6/7)App.config (фрагмент) <servicebehaviorConfiguration="CalcWCF.CalcServiceBehavior" name="CalcWCF.CalcService"> <endpointaddress="" binding="wsHttpBinding”contract="CalcWCF.ICalcService"> </endpoint> . . . <host> <baseAddresses> <addbaseAddress="http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> </baseAddresses> </host> </service> Інтерфейс (WCF-служби) – основа контракту кінцевої точки (endpoint) Система конфігурування .Net Framework спряжена із середовищем розгортання. Якщо для IIS в якості конфігураційного файлу має виступати Web.config, то в інших випадках – App.config . У Visual Studio на основі App.config створюється (з автоматичною підтримкою змін) кінцевий файл конфігурації у вигляді :«ім'я збірки».exe.config. WCF - 2010

  33. Пригадаємо WSі порівняємо Серверний проект CalcWCF. (7/7)Маленька перевірка у браузері <endpointaddress="" . . . <host> <baseAddresses> <addbaseAddress="http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> . . . App.config (фрагмент) WCF - 2010

  34. Пригадаємо WSі порівняємо Важливий висновок: можливість отримання метаданих WCF-службу форматіWSDL (1/2) Натиснути WCF - 2010

  35. Пригадаємо WSі порівняємо Важливий висновок: можливість отримання метаданих WCF-службу форматіWSDL (2/2) Клас проксі (у прикладі – CalcServiceCLient) WCF - 2010 CalcService – і’мя класу (реалізації)WCF-служби

  36. За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері? (1/3) <services> <servicebehaviorConfiguration="CalcWCF.CalcServiceBehavior" name="CalcWCF.CalcService"> <endpointaddress="" binding="wsHttpBinding”contract="CalcWCF.ICalcService"> </endpoint> <endpointaddress="mex" binding="mexHttpBinding”contract="IMetadataExchange" /> <host> <baseAddresses> <addbaseAddress= "http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> </baseAddresses> </host> </service> </services> • По-перше, App.config містить описи двох (!) кінцевих точок WCF-служби "mex” – від MetadataExchange Файл App.config (фрагмент) WCF - 2010

  37. За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері? (2/3) <behaviors> <serviceBehaviors> <behaviorname="CalcWCF.CalcServiceBehavior"> <serviceMetadatahttpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <servicebehaviorConfiguration="CalcWCF.CalcServiceBehavior" name="CalcWCF.CalcService"> <endpointaddress="" binding="wsHttpBinding”contract="CalcWCF.ICalcService"> </endpoint> <endpointaddress="mex" binding="mexHttpBinding”contract="IMetadataExchange" /> Файл App.config (фрагмент) • По-друге, в App.config міститься опис спеціальної поведінки (behavior) WCF-служби За замовчуванням – ”false" Забезпечується можливість доступу до метаданих безпосередньо із браузера, використовуючи операцію GET протоколу HTTP WCF - 2010

  38. За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері? (3/3) <behaviorname="CalcWCF.CalcServiceBehavior"> <serviceMetadatahttpGetEnabled="true" /> </behavior> Файл App.config (фрагменти) <servicebehaviorConfiguration="CalcWCF.CalcServiceBehavior" name="CalcWCF.CalcService"> <endpointaddress="mex" binding="mexHttpBinding”contract="IMetadataExchange" /> WCF - 2010

  39. Доступ до метаданих служби. Альтернативний варіант Цей варіант є варіантом за замовчуванням Файл App.config (фрагмент) <serviceMetadatahttpGetEnabled = ”false" /> <endpointaddress="mex" binding="mexHttpBinding”contract="IMetadataExchange" /> Увага! Це не посилання! <baseAddresses> <addbaseAddress= "http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> </baseAddresses> WCF - 2010 Файл App.config (фрагмент)

  40. Служби з кількома кінцевими точками. Зауваження Можна задавати декілька кінцевих точок навіть з одним контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Пригадаємо: Зауваження. Якщо служба має декілька кінцевих точок, то у кожної з них має бути унікальна адреса. <endpointaddress="" binding="wsHttpBinding”contract="CalcWCF.ICalcService"> </endpoint> <endpointaddress="mex" binding="mexHttpBinding”contract="IMetadataExchange" /> <host> <baseAddresses> <addbaseAddress= "http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> </baseAddresses> </host> Файл App.config (фрагмент) WCF - 2010

  41. Доступ до метаданих служби Metadata <endpointaddress="mex”binding="mexHttpBinding”contract= "IMetadataExchange" /> WCF - 2010

  42. Клієнтський WinForms-проект CalcClient. (1/5) Отримання проксі (Microsoft Visual Studio 2008) <endpointaddress="" . . . <host> <baseAddresses> <addbaseAddress="http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> . . . 2. Увести 3. Натиснути 4. Обрати 1. Обрати 6. Натиснути 5. Увести WCF - 2010

  43. Клієнтський WinForms-проект CalcClient. (2/5)“Add Service Reference” (“Добавить ссылку на службу”) Клас проксі (у прикладі – CalcServiceCLient) WCF - 2010 CalcService – і’мя класу (реалізації)WCF-служби

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

  45. Клієнтський WinForms-проект CalcClient. (3/5) Модуль Reference.cs із проксі-класом (фрагмент) //------------------------------------------------------------------------------ // <auto-generated> // Этот код создан программой. // Исполняемая версия:2.0.50727.3053 // // Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае // повторной генерации кода. // </auto-generated> //------------------------------------------------------------------------------ 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>, CalcClient.CalcRef.ICalcService { public CalcServiceClient() { } . . . WCF - 2010

  46. Клієнтський 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

  47. Клієнтський WinForms-проект CalcClient. (5/5)app.config (фрагмент) <client> <endpointaddress="http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/" binding="wsHttpBinding”bindingConfiguration="WSHttpBinding_ICalcService" contract="CalcRef.ICalcService”name="WSHttpBinding_ICalcService"> </endpoint> </client> Файл app.config (фрагмент) WCF - 2010

  48. CalcService — проект із режимом PerSession ! - Як впливати? - Behavior! • Отже, PerSession — режим за замовчуванням. WCF - 2010

  49. CalcService — проект із режимом PerSession ! - Як впливати? - Behavior! • Отже, PerSession — режим за замовчуванням. WCF - 2010

  50. Behavior. Пригадаємо… За рахунок чого забезпечується доступ до метаданих служби та отримання її WSDL-опису у браузері? (3/3) <behaviorname="CalcWCF.CalcServiceBehavior"> <serviceMetadatahttpGetEnabled="true" /> </behavior> Файл App.config (фрагменти) <servicebehaviorConfiguration="CalcWCF.CalcServiceBehavior" name="CalcWCF.CalcService"> <endpointaddress="mex" binding="mexHttpBinding”contract="IMetadataExchange" /> WCF - 2010

More Related