1 Przetwarzanie rozproszoneDomeny Aplikacji ( AppDomain ) AppDomain A AppDomain B Pakiet A1 Pakiet B1 . . Pakiet Bm Pakiet An
2 tworzenie nowej domeny aplikacji// Ustawienie ApplicationBase na bieżący katalog AppDomainSetup info = new AppDomainSetup(); info.ApplicationBase System.Environment.CurrentDirectory; // Utworzenie domeny aplikacji AppDomain dom = AppDomain.CreateDomain("RemoteDomain", null, info);
3 // Załadowanie pakietu Display// i utworzenie egzemplarza typu Display BindingFlags flags = (BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance); ObjectHandle objh = dom.CreateInstance ("Display", "Display.Disp", // plik, klasa false, flags, null, null, null, null, null); // Rozpakowanie obiektu Object obj = objh.Unwrap(); // Rzutowanie do aktualnego typu Disp h = (Disp)obj; // Wywołanie metody h.Show("Dobry wieczór!"); Domain
4 AppDomain A AppDomain B Wątek AP1 Wątek AP2 Wątek BP1Aplikacja rozproszona AppDomain A AppDomain B Dane wspólne Dane wspólne Wątek AP1 Stos lokalny Pamięć lokalna Wątek AP2 Stos lokalny Pamięć lokalna Wątek BP1 Stos lokalny Pamięć lokalna
5 WCF Windows Communication FoundationTechnologie wymiany danych pomiędzy aplikacjami IPC ( Inter Process Communication, Named Pipes ) DCOM, COM+ ( Distributed Common Object Model ) MSMQ ( Microsoft Message Queuing ) NET . Remoting XML Web Services NET.Networking (gniazda, klasy: transportowe, protokółów) Peer – to – Peer WCF Windows Communication Foundation
6 W C F : Windows Communication Foundationudostępnianie usług (operacji), kolekcji danych, komputer lokalny, sieć lokalna, internet zarządzanie usługodawcą: system Windows IIS : Internet Information Services WAS : Windows Activation Service (Win 7, WS) AppFabric (Windows Server) Juval Löwy, Programowanie usług WCF, Helion – O'Reilly, 2012
7 Przeźroczysty zastępcaSingleCall, Singleton, ClientActivated NET . Remoting Obiekt zdalny Klient F1(x) F1(x) Przeźroczysty zastępca Serwer Rzeczywisty zastępca Kanał : HTTP, TCP { BIN, SOAP } pliki konfiguracyjne, konfiguracja programowa
8 W C F : Windows Communication FoundationKlient (client) Nosiciel (host) Zastępca (proxy) Kontrakt (contract) Plik konfiguracyjny (configuration file) Plik konfiguracyjny (configuration file)
9 ABC technologii WCF A : adres ( address ) - lokalizacja usługi, kolekcji danych B : powiązanie ( binding ) - protokóły, kodowanie, transport C : kontrakt ( contract ) - definicje udostępnianych metod, kolekcji danych A + B + C punkt końcowy ( endpoint )
10 Adresy ( lokalizacja kontraktu )składnia adresu [ adres_bazowy ] / [ opcjonalny URI ] adres bazowy [ rodzaj_transportu ] [ komputer lub domena ] [ : opcjonalny numer portu ]
11 Rodzaje adresów adresy TCP net.tcp//localhost:8004/NowaUsługanet.tcp// :7000/DalekaUsługa adresy HTTP // port domyślny 80 adresy IPC net.pipe://localhost/DużaRura adresy MSMQ net.msmq://localhost/Kol_A // publiczna net.msmq://localhost/private/Kol_B // prywatna
12 Powiązania ( protokół transportowy / kodowanie )powiązanie podstawowe ( interoperacyjne ) HTTP, HTTPS / tekstowe, MTOM ( SOAP Message Transmission Optimization Mechanism ) basicHttpBinding powiązanie TCP ( intranet, tylko WCF ) TCP / binarne ( Microsoft specific ) netTcpBinding
13 powiązanie IPC ( ten sam komputer )IPC / binarne ( Microsoft specific ) netNamedPipeBinding powiązanie WS ( interoperacyjne WS-*) HTTP, HTTPS / tekstowe, MTOM wsHttpBinding powiązanie MSMQ MSMQ / binarne ( Microsoft specific ) netMsmqBinding
14 Rodzaje kontraktów kontrakt danych kontrakt komunikatówkontrakt usług kontrakt danych kontrakt komunikatów kontrakt błędów
15 Kontrakt usług interfejsy realizowane przez dedykowane klasybiblioteka .dll udostępniająca : interfejsy realizowane przez dedykowane klasy metody definiowane w klasach
16 // kontrakt - udostępnianie interfejsuusing System.ServiceModel; namespace Wyrocznia { [ServiceContract] // ew. nazwa usługi, domena public interface IPorada [OperationContract] string Odpowiedz (string pytanie); } public class Babka : IPorada { public string Odpowiedz (string pytanie) { return " Tak! "; } } } // .dll
17 // udostępnianie metod[ServiceContract] public class WhereWhen { [OperationContract] public string Where ( ) { return " Miami "; } public string When ( ) { return " Tomorrow "; } }
18 using System.ServiceModel; // nosicielusing Wyrocznia; // .dll w katalogu domyślnym namespace NosicielWyroczni { class Nosiciel static void Main(string [ ] args) { using (ServiceHost sHost = new ServiceHost ( typeof ( Babka ))) { sHost.Open(); Console.WriteLine("Nosiciel jest czynny."); Console.WriteLine("Naciśnij Enter aby zakończyć..."); Console.ReadLine( ); } } } // aplikacja konsolowa
19 // klient // uruchomić nosiciela // AddServiceReference Wróżka, PoradaClient ( usługa, obiekt interfejsu ) // dodać referencję usługi Wróżka using KlientWyroczni.Wróżka; namespace KlientWyroczni { class Program { static void Main ( string [ ] args ) { using ( PoradaClient babka = new PoradaClient ( )) string odp = babka.Odpowiedz ( " Jak żyć ? " ); Console.WriteLine( "Wyrocznia powiedziała : " odp ); } } } // można użyć svcutil.exe (NET.SDK)
20 Plik konfiguracyjny nosiciela
22 Powiązanie TCP Wyrocznia TCP // plik konfiguracyjny nosiciela
23 Powiązanie IPC Wyrocznia IPC // plik konfiguracyjny nosiciela
24 Asynchroniczne wywołanie usługikontrakt usługi, nosiciel : bez zmian uruchomić nosiciela po dokonaniu połączenia z nosicielem w oknie AddService Reference wybrać Advanced i zaznaczyć Generate asynchronous operations w programie klienta:
25 Wyrocznia ASY using (PoradaClient proxy = new PoradaClient()) {proxy.Open(); IAsyncResult result = proxy.BeginOdpowiedz( pytanie, // argument funkcji Odpowiedz // funkcja zwrotna ar => { Console.WriteLine("Wróżka odpowiedziała : " + proxy.EndOdpowiedz(ar)); }, null); // asyncState while (!result.IsCompleted) Thread.Sleep(100); } Wyrocznia ASY
26 // w programie usługi .dllKontrakty danych // w programie usługi .dll [ServiceContract] public interface IUniversity { [OperationContract] Student GetStudent ( int album ); }
27 [DataContract] public class Student { [DataMember] public string ForeName; public string LastName; public int Album; public double Score; }
28 DataContract // nosiciel bez zmian ( .cs i .config ) //// klient dodawanie referencji serwisu bez zmian // program : using UnivClient.University; UniversityClient szukacz = new UniversityClient(); string pytanie; UnivClient.University.Student st; pytanie = Console.ReadLine(); st = szukacz.GetStudent( int.Parse ( pyt )); DataContract
29 ABC definiowane programowokontrakt .dll bez zmian nosiciel using System.ServiceModel; using Wyrocznia; namespace Nosiciel { class Program { static void Main(string[] args) { ServiceHost serviceHost = new ServiceHost(typeof(Babka)); BasicHttpBinding basicBinding = new BasicHttpBinding(); serviceHost.AddServiceEndpoint(typeof(IPorada), basicBinding, "http://localhost:8091/Babka"); serviceHost.Open(); }}}
30 klient Prog // AddServiceReference jak poprzedniousing System.ServiceModel; using Klient.Wróżka; namespace Klient { class Program { static void Main(string[] args) { BasicHttpBinding basicBinding = new BasicHttpBinding(); EndpointAddress address = new EndpointAddress("http://localhost:8091/Babka"); PoradaClient pytia = new PoradaClient(basicBinding, address); } } } Prog
31 Usługi współużytkowanekontrakt .dll namespace Liczarka { [ServiceContract] public interface IDodawanie [OperationContract] int Dodaj(int start); }
32 [ServiceBehavior(InstanceContextMode =InstanceContextMode.Single)] public class Licznik : IDodawanie { static int Obiekty = 0; int Ile = 0; public Licznik() { ++Obiekty; } public int Dodaj(int kto) return kto + ++Ile * 10 + Obiekty * 1000; }}
33 nosiciel static void Main(string[] args) {Console.WriteLine("***** Nosiciel Single *****"); Licznik lili = new Licznik(); ServiceHost serviceHost = new ServiceHost(lili); // Open the host and start listening. serviceHost.Open(); }
34 klient Single DodawanieClient licz = new DodawanieClient();int odp, start = 3; Console.WriteLine("Dodaj "); Console.ReadLine(); odp = licz.Dodaj(kto); Console.WriteLine("Kto = {0}, Licznik = {1}, Obiekty = {2}", (odp % 10).ToString(), (odp % 1000 / 10).ToString(), (odp / 1000).ToString() ); Single
35 Wydajność kanałów
36 TimePerf