830 likes | 1.01k Views
Windows Communication Foundation (від Microsoft ). 2010-2011. Windows Communication Foundation ( WCF ). Windows Communication Foundation ( WCF ).
E N D
Windows Communication Foundation (WCF) • WCF як технологія, пов'язана зі службами: створенням, розгортанням, використанням служб, їх безпекою, транзакційністю, надійністю доставки повідомлень тощо. • Розвиток WCF відбуваєтьсяна засадах підтримки стандартів служб (зокрема, “розширених” служб – служб узгоджених зі стандартом ws-*) та забезпеченням інтероперабельності. Служби складають основу сучасної глобальної розподіленої мережі, а WCF вважають найпростішим засобом їх надання та використання на платформі Microsoft. Відповідна простота досягається за рахунок інкапсуляції технології (проте не приховуванням!) у різноманітних інструментальних засобах, зокрема у MS Visual Studio. WCF
Основи архітектури WCF • WCF-сервіс публікує колекцію кінцевих точок (Endpoints). Кожну кінцеву точку можна розглядати як портал для спілкування із клієнтськими програмами. • WCF-клієнт може звертатись до однієї чи декількох кінцевих точок і також може публікувати власні кінцеві точки для прийому повідомлень від WCF-сервісів. • Кінцева точка визначається наданням “алфавітної трійки ABC”: • Address(адреса); • Binding(прив'язка); • Contract(контракт). WCF
Кінцеві точки WCF (1/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). • Адреса кінцевої точки (Address) – це звичайна мережна адреса, де розташований відповідний портал. • Прив'язка (Binding) кінцевої точки визначає, як реалізується обмін повідомленнями, зокрема, який обрано транспортний протокол (TCP, HTTP тощо), яке використовується кодування (text, binary тощо), чи використовуються засоби безпеки та ін. • Контракт (Contract) кінцевої точки визначає, що складає предмет спілкування, тобто які, наприклад, можливі запити до WCF-сервісу і які можливі відповіді. Можуть використовуватись різні базові шаблони обміну повідомленнями (basic Message Exchange Patterns), наприклад, запит/відповідь, симплекс, дуплекс. (“Функціональний інтерфейс”) WCF
Кінцеві точки WCF (2/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). Можна задавати декілька кінцевих точок навіть з одним і тим самим контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Наприклад, щоб забезпечити “максимально відкритий доступ” клієнтів до сервісу, можна скористатись (стандартною) прив’язкою binding=“basicHttpBinding”(ця прив’язка відповідає відомій специфікації: Web Services InteropBasic Profile 1.1 – WS-I BP1.1), а щоб досягти максимальної продуктивності міжмашинної взаємодії у корпоративній мережі на платформі .Netдоцільно скористатись (стандартною) прив’язкоюbinding=“netTcpBinding”(ця прив’язка базується на використанні, по-перше, транспортного протоколу tcp та, по-друге, двійкового кодування). WCF
До специфікації веб-сервісів ... можна скористатись (стандартною) прив’язкою 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
Прив’язки Прив'язка (Binding) описує комунікаційні деталі, що пов'язані з використанням служби. Поняття прив'язки можна розглядати як деякий аналог поняття стеку каналів, тобто деякої конфігурації (послідовної комбінації) каналів. (Прив'язка складається відповідно з набору елементів прив'язки.) Важливо усвідомлювати, що повідомлення служб обробляються послідовно кожним із каналів стеку. Використовуються канали двох видів: транспортні (єдиний транспортний канал розташовується “внизу” стека: при відправленні повідомлення він використовується останнім, а при прийнятті – першим) та протокольні (зокрема, вони можуть забезпечувати шифрування повідомлень, стискання, кодування тощо). WCF
Прив’язки. Варіанти транспортних каналів Можливі варіанти транспортних каналів (протоколів): • HTTP; • TCP; • MSMQ (канал черг повідомлень згідно до технології Microsoft Message Queue; специфіка: “незв'язаний” клієнт, обмін даними односторонній); • NamedPipes (іменовані канали; такий варіант забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині); • PerChannel (пірінговий канал, у пірінговій архітектурі peer-to-peer – P2P кожен вузол “має рівні права”: виступає по відношенню до інших вузлів як у ролі клієнта, так і у ролі сервера). (Порівняйте з архітектурою клієнт-сервер.) WCF Ілюстрація до пірінгової моделі
Прив'язки на замовлення. Приклади (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
Прив'язки. Конфігурування Приклад програмного конфігурування прив'язки (приклад 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
Стандартні прив’язки Можна використовувати стандартні (“готові)” прив'язки. Наведемо приклади найбільш уживаних стандартних прив'язок: • basicHttpBinding; • wsHttpBinding; • ws2007HttpBinding; • webHttpBinding; • netTcpBinding; • netNamedPipeBinding (забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині). WCF
Прив’язка 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
Прив’язка 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
Прив’язка 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
Прив’язка webHttpBinding та RESTful-служби.Приклад HTTP Get. UriTemplate db table WCF
Прив’язка netTcpBinding: • призначена для міжмашинної взаємодії .Net додатків (тільки на платформі .Net !). • використовує елемент прив'язки TcpTransportBindingElement; • формат адресації: net.tcp://<хост>[:<порт>]/<служба>(порт за замовчуванням – 808); • як і для інших прив'язок, визначено властивості (загалом їх 17), які можна встановлювати конфігуруванням. Наприклад, maxConnection визначає максимальну кількість одночасних підключень із кінцевою точкою (за замовчуванням – 10), closeTimeOut – максимальне очікування закриття з'єднання (за замовчуванням – 00:01:00). WCF
Генерація (із використанням шаблону) WCF-проекту у MS Visual Studio 2008 WCF
Створення проекту та його запуск • Створення проекту та його запуск (Ctrl+F5). • Відкриття у браузері. Дивись наступний слайд ПКМ WCF
Відкриття WCF-проекту браузері (2/2)Проксі-клас служби Проксі-клас WCF
Генерація (із використанням шаблону) WCF-проекту у MS Visual Studio 2010 WCF
Створення проекту та його запуск Як і у Visual Studio 2008, можливий запуск проекту та відкриття у браузері. Але додатково (по Ctrl+F5) генерується клієнтський тест-проект (з іменем “WCF Test Client”) WCF
Клієнтський тест-проект WCF MS Visual Studio 2010: автоматична генерація тестів Ctrl+F5 — генерується клієнтський тест-проект “WCF Test Client” Дивись наступний слайд WCF
Клієнтський тест-проект WCF MS Visual Studio 2010: автоматична генерація тестів Клієнтський тест-проект “WCF Test Client” WCF
Клієнтський тест-проект.Тестування операції GetDataUsingDataContract Тестування операції GetDataUsingDataContract WCF
Тестування операції GetDataUsingDataContract Тестування GetDataUsingDataContract (вигляд XML-повідомлень) WCF
Клієнтський тест-проект. Вигляд конфігураційного файлу Клієнтський конфігураційний файл WCF
WCF. Демонстраційний приклад (із серверним проектом CalcWCF) WCF
Створення серверного проекту CalcWCF . (1/7)(Microsoft Visual Studio 2008) У звичайний консольний проект додамо WCF -службу, скориставшись майстром: 1. Обрати 2. Увести 3. Натиснути WCF
Серверний проект 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
Серверний проект 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
Серверний проект 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
Серверний проект 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
Серверний проект 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
Пригадаємо WSі порівняємо Серверний проект CalcWCF. (7/7)Запуск проекту та його відкриття у браузері <endpointaddress="" . . . <host> <baseAddresses> <addbaseAddress="http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> . . . App.config (фрагмент) WCF
До можливості отримання метаданих WCF-службиу форматіWSDL (1/2) Пригадаємо WSі порівняємо Натиснути WCF
До можливості отримання метаданих WCF-службиу форматіWSDL (2/2) Пригадаємо WSі порівняємо Клас проксі (у прикладі – CalcServiceCLient) WCF CalcService – ім'я класу (реалізації) WCF-служби
Чим забезпечується можливість доступу до метаданих служби та отримання її 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
Чим забезпечується можливість доступу до метаданих служби та отримання її 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
Чим забезпечується можливість доступу до метаданих служби та отримання її WSDL-опису у браузері? (3/3) <behaviorname="CalcWCF.CalcServiceBehavior"> <serviceMetadatahttpGetEnabled="true" /> </behavior> Файл App.config (фрагменти) <servicebehaviorConfiguration="CalcWCF.CalcServiceBehavior" name="CalcWCF.CalcService"> <endpointaddress="mex" binding="mexHttpBinding”contract="IMetadataExchange" /> WCF
До програмного доступу до метаданих служби. Випадок <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 (фрагмент)
Служби з кількома кінцевими точками. Зауваження Можна задавати декілька кінцевих точок навіть з одним і тим самим контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Пригадаємо: Зауваження. Якщо служба має декілька кінцевих точок, то у кожної з них має бути унікальна адреса. <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
Кінцева точка доступу до метаданих служби Metadata <endpointaddress="mex”binding="mexHttpBinding”contract= "IMetadataExchange" /> WCF
Клієнтський 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
Клієнтський WinForms-проект CalcClient. (2/5)“Add Service Reference” (“Добавить ссылку на службу”) За лаштунками – використання утиліти svcutil.exe Пригадаємо! svcutil.exehttp://localhost:8731/Design_Time_Addresses/ CalcWCF/CalcService/mex/ -app.config -genProxy.cs Можливість обрати ім'я конфігураційного файлу Можливість обрати мову для коду проксі WCF
Клієнтський 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
Клієнтський 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