1 / 83

Windows Communication Foundation (від Microsoft )

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

Télécharger la présentation

Windows Communication Foundation (від Microsoft )

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. Windows Communication Foundation (від Microsoft) 2010-2011

  2. Windows Communication Foundation (WCF) WCF

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

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

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

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

  7. До специфікації веб-сервісів ... можна скористатись (стандартною) прив’язкою binding=“basicHttpBinding”(ця прив’язка відповідає відомій специфікації: Web Services InteropBasic 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

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

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

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

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

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

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

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

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

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

  17. Прив’язка webHttpBinding: • є сумісною із RESTful-службами. Презентація“WCF REST(RESTful -служби із використанням WCF)” WCF

  18. Прив’язка webHttpBinding та RESTful-служби.Приклад HTTP Get. UriTemplate db table WCF

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

  20. Генерація (із використанням шаблону) WCF-проекту у MS Visual Studio 2008 WCF

  21. Створення проекту та його запуск • Створення проекту та його запуск (Ctrl+F5). • Відкриття у браузері. Дивись наступний слайд ПКМ WCF

  22. Відкриття WCF-проекту браузері (1/2) WCF

  23. Відкриття WCF-проекту браузері (2/2)Проксі-клас служби Проксі-клас WCF

  24. Генерація (із використанням шаблону) WCF-проекту у MS Visual Studio 2010 WCF

  25. Створення проекту та його запуск Як і у Visual Studio 2008, можливий запуск проекту та відкриття у браузері. Але додатково (по Ctrl+F5) генерується клієнтський тест-проект (з іменем “WCF Test Client”) WCF

  26. Клієнтський тест-проект WCF MS Visual Studio 2010: автоматична генерація тестів Ctrl+F5 — генерується клієнтський тест-проект “WCF Test Client” Дивись наступний слайд WCF

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

  28. Клієнтський тест-проект.Тестування операції GetDataUsingDataContract Тестування операції GetDataUsingDataContract WCF

  29. Тестування операції GetDataUsingDataContract Тестування GetDataUsingDataContract (вигляд XML-повідомлень) WCF

  30. Клієнтський тест-проект. Вигляд конфігураційного файлу Клієнтський конфігураційний файл WCF

  31. WCF. Демонстраційний приклад (із серверним проектом CalcWCF) WCF

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

  33. Серверний проект 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

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

  35. Серверний проект CalcWCF . (4/7)Ще одна версія CalcService.cs (версія для дослідження WCF) Із використанням 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

  36. Серверний проект 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

  37. Серверний проект 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

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

  39. До можливості отримання метаданих WCF-службиу форматіWSDL (1/2) Пригадаємо WSі порівняємо Натиснути WCF

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

  41. Чим забезпечується можливість доступу до метаданих служби та отримання її 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

  42. Чим забезпечується можливість доступу до метаданих служби та отримання її 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

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

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

  45. Служби з кількома кінцевими точками. Зауваження Можна задавати декілька кінцевих точок навіть з одним і тим самим контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Пригадаємо: Зауваження. Якщо служба має декілька кінцевих точок, то у кожної з них має бути унікальна адреса. <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

  46. Кінцева точка доступу до метаданих служби Metadata <endpointaddress="mex”binding="mexHttpBinding”contract= "IMetadataExchange" /> WCF

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

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

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

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

More Related