790 likes | 921 Views
Основи технології Microsoft Windows Communication Foundation. 2010. ( Курс “Інформаційні технології” ). Windows Communication Foundation ( WCF ).
E N D
ОсновитехнологіїMicrosoft Windows Communication Foundation 2010 (Курс “Інформаційні технології”)
Windows Communication Foundation (WCF) • WCF як технологія, пов'язана зі службами: створенням, розгортанням, використанням служб, їх безпекою, транзакційністю, надійністю доставки повідомлень тощо. • Розвиток WCF відбуваєтьсяна засадах підтримки стандартів служб (зокрема, “розширених” служб – служб узгоджених зі стандартом ws-*) та забезпеченням інтероперабельності. Служби складають основу сучасної глобальної розподіленої мережі, а WCF вважають найпростішим засобом їх надання та використання на платформі Microsoft. Відповідна простота досягається за рахунок інкапсуляції технології (проте не приховуванням!) у різноманітних інструментальних засобах, зокрема у MS Visual Studio. WCF - 2010
Основи архітектури WCF • WCF-сервіс публікує колекцію кінцевих точок (Endpoints). Кожну кінцеву точку можна розглядати як портал для спілкування із клієнтськими програмами. • WCF-клієнт може звертатись до однієї чи декількох кінцевих точок і також може публікувати власні кінцеві точки для прийому повідомлень від WCF-сервісів. • Кінцева точка визначається наданням “алфавітної трійки ABC”: • Address(адреса); • Binding(прив'язка); • Contract(контракт). WCF - 2010
Кінцеві точки WCF (1/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). • Адреса кінцевої точки (Address) – це звичайна мережна адреса, де розташований відповідний портал. • Прив'язка (Binding) кінцевої точки визначає, як реалізується обмін повідомленнями, зокрема, який обрано транспортний протокол (TCP, HTTP тощо), яке використовується кодування (text, binary тощо), чи використовуються засоби безпеки та ін. • Контракт (Contract) кінцевої точки визначає, що складає предмет спілкування, тобто які, наприклад, можливі запити до WCF-сервісу і які можливі відповіді. Можуть використовуватись різні базові шаблони обміну повідомленнями (basic Message Exchange Patterns), наприклад, запит/відповідь, симплекс, дуплекс. (“Функціональний інтерфейс”) WCF - 2010
Кінцеві точки WCF (2/2) Кінцева точка визначається наданням адреси (Address), прив'язки (Binding) та контракту (Contract). Можна задавати декілька кінцевих точок навіть з одним контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Наприклад, щоб забезпечити “максимально відкритий доступ” клієнтів до сервісу, можна скористатись (стандартною) прив’язкою binding=“basicHttpBinding”(ця прив’язка відповідає відомій специфікації: Web Services InteropBasic Profile 1.1 – WS-I BP1.1), а щоб досягти максимальної продуктивності міжмашинної взаємодії у корпоративній мережі на платформі .Netдоцільно скористатись (стандартною) прив’язкоюbinding=“netTcpBinding”(ця прив’язка базується на використанні, по-перше, транспортного протоколу tcp та, по-друге, двійкового кодування). WCF - 2010
Прив’язки Прив'язка (Binding) описує комунікаційні деталі, що пов'язані з використанням служби. Поняття прив'язки можна розглядати як деякий аналог поняття стеку каналів, тобто деякої конфігурації (послідовної комбінації) каналів. (Прив'язка складається відповідно з набору елементів прив'язки.) Важливо усвідомлювати, що повідомлення служб обробляються послідовно кожним із каналів стеку. Використовуються канали двох видів: транспортні (єдиний транспортний канал розташовується “внизу” стека: при відправленні повідомлення він використовується останнім, а при прийнятті – першим) та протокольні (зокрема, вони можуть забезпечувати шифрування повідомлень, стискання, кодування тощо). WCF - 2010
Прив’язки. Варіанти транспортних каналів Можливі варіанти транспортних каналів (протоколів): • HTTP; • TCP; • MSMQ (канал черг повідомлень згідно до технології Microsoft Message Queue; специфіка: “незв'язаний” клієнт, обмін даними односторонній); • NamedPipes (іменовані канали; такий варіант забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині); • PerChannel (пірінговий канал, у пірінговій архітектурі peer-to-peer – P2P кожен вузол “має рівні права”: виступає по відношенню до інших вузлів як у ролі клієнта, так і у ролі сервера). (Порівняйте з архітектурою клієнт-сервер, багаторівневою архітектурою.) WCF - 2010 Ілюстрація до пірінгової моделі
Прив'язки на замовлення. Приклади (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
Прив'язки на замовлення. Приклади (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
Стандартні прив’язки Можна використовувати стандартні (“готові)” прив'язки. Наведемо приклади найбільш уживаних стандартних прив'язок: • basicHttpBinding; • wsHttpBinding; • ws2007HttpBinding; • netTcpBinding; • netNamedPipeBinding (забезпечує високу продуктивність для локальних комунікацій, тобто між процесами чи доменами на одній машині). WCF - 2010
Прив’язка 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
Прив’язка 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
Прив’язка 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 2008. WCF-проект, що генерується майстром (2/3) WCF - 2010
MS Visual Studio 2008. WCF-проект, що генерується майстром (3/3) Проксі-клас WCF - 2010
MS Visual Studio 2010. WCF-проект, що генерується майстром (1/6) • Генерується такий саме проект, як і у Visual Studio 2008. • Так само можливий безпосередній запуск проекту (Ctrl+F5) та перегляд у браузері. WCF - 2010
MS Visual Studio 2010. WCF-проект (C#), що генерується майстром (2/6) WCF MS Visual Studio 2010: автоматична генерація тестів Ctrl+F5 — генерується клієнтський тест-проект “WCF Test Client” Див. наступн. слайд 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. Демонстраційний приклад WCF - 2010
Серверний проект CalcWCF . (1/7)(Microsoft Visual Studio 2008) У звичайний консольний проект додамо WCF -службу, скориставшись майстром: 1. Обрати 2. Увести 3. Натиснути WCF - 2010
Серверний проект 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
Серверний проект 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
Серверний проект 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
Серверний проект 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
Серверний проект 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
Пригадаємо WSі порівняємо Серверний проект CalcWCF. (7/7)Маленька перевірка у браузері <endpointaddress="" . . . <host> <baseAddresses> <addbaseAddress="http://localhost:8731/Design_Time_Addresses/CalcWCF/CalcService/"/> . . . App.config (фрагмент) WCF - 2010
Пригадаємо WSі порівняємо Важливий висновок: можливість отримання метаданих WCF-службу форматіWSDL (1/2) Натиснути WCF - 2010
Пригадаємо WSі порівняємо Важливий висновок: можливість отримання метаданих WCF-службу форматіWSDL (2/2) Клас проксі (у прикладі – CalcServiceCLient) WCF - 2010 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 - 2010
За рахунок чого забезпечується доступ до метаданих служби та отримання її 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
За рахунок чого забезпечується доступ до метаданих служби та отримання її 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
Доступ до метаданих служби. Альтернативний варіант Цей варіант є варіантом за замовчуванням Файл 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 (фрагмент)
Служби з кількома кінцевими точками. Зауваження Можна задавати декілька кінцевих точок навіть з одним контрактом, надаючи (через прив’язки) різні можливості щодо його використання. Пригадаємо: Зауваження. Якщо служба має декілька кінцевих точок, то у кожної з них має бути унікальна адреса. <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
Доступ до метаданих служби Metadata <endpointaddress="mex”binding="mexHttpBinding”contract= "IMetadataExchange" /> WCF - 2010
Клієнтський 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
Клієнтський WinForms-проект CalcClient. (2/5)“Add Service Reference” (“Добавить ссылку на службу”) Клас проксі (у прикладі – CalcServiceCLient) WCF - 2010 CalcService – і’мя класу (реалізації)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 - 2010
Клієнтський 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
Клієнтський 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 (фрагмент) <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
CalcService — проект із режимом PerSession ! - Як впливати? - Behavior! • Отже, PerSession — режим за замовчуванням. WCF - 2010
CalcService — проект із режимом PerSession ! - Як впливати? - Behavior! • Отже, PerSession — режим за замовчуванням. WCF - 2010
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