Programowanie Systemów Rozproszonych Laboratorium 3 WCF. Paweł Paduch

Podobne dokumenty
Programowanie Systemów Rozproszonych Laboratorium 2 WCF. Paweł Paduch

Programowanie Systemów Rozproszonych - WCF

Programowanie Systemów Rozproszonych - WCF REST

namespace HostedReceiver { public class Receiver: IConfigureThisEndpoint, AsA_Server {

Tworzenie i wykorzystanie usług sieciowych

Programowanie Systemów Rozproszonych Laboratorium 1 Wprowadzenie do Visual Studio i C# Paweł Paduch

Web Services (SOAP) Ćwiczenie 1

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Usługi sieciowe laboratorium 2013 K.M. Ocetkiewicz, T. Goluch

Db4o obiektowa baza danych wersja.net

Prosta książka telefoniczna z wykorzystaniem zapisu do pliku

Zaawansowane aplikacje internetowe - laboratorium

Programowanie obiektowe

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

ABC WCF.

Usługi sieciowe laboratorium 2013 K.M. Ocetkiewicz, T. Goluch

Aplikacje RMI

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Laboratorium 10 - Web Services

Michał Jankowski. Remoting w.net 2.0

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Aplikacje RMI Lab4

Wykład 12. Programowanie serwera MS SQL 2005 w C#

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Usługi sieciowe laboratorium 2018 K.M. Ocetkiewicz, T. Goluch

Instrukcja laboratoryjna cz.7

Instrukcja laboratoryjna cz.6

Aplikacje internetowe i rozproszone - laboratorium

Rozdział 2. Debugowanie kodu

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

.NET NET Framework Microsoft Windows Communication Foundation Microsoft Windows Presentation Foundation Microsoft Windows Workflow Foundation

RESTful WCF Services. Autor ćwiczenia: Piotr Ostrowski. Kroki ćwiczenia : 1. Utworzenie nowego projektu RESTful WCF.

Instrukcja laboratoryjna cz.2

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

Platformy Programowania

Instrukcja laboratoryjna

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

I - Microsoft Visual Studio C++

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Platforma.NET. Laboratorium nr 1 Podstawy języka C#

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl

Programowanie Systemów Rozproszonych - WCF

Usługi sieciowe laboratorium 2017 K.M. Ocetkiewicz, T. Goluch

Zaawansowane aplikacje internetowe laboratorium REST

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Instrukcja laboratoryjna nr.2

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Projektowanie aplikacji internetowych laboratorium

Git, Bitbucket, IntelliJ IDEA

Usługi sieciowe laboratorium 2013 K.M. Ocetkiewicz, T. Goluch

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Zaawansowane aplikacje internetowe

ESDI. WebService. Wersja 1.2. Strona 1

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Zastosowanie komponentów EJB typu Session

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Wstęp. Skąd pobrać program do obsługi FTP? Logowanie

Zaawansowane aplikacje WWW - laboratorium

Aplikacje WWW. Laboratorium z przedmiotu Aplikacje WWW - zestaw 01

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Systemy Rozproszone - Ćwiczenie 6

Instrukcja instalacji Control Expert 3.0

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

MATERIAŁY DO ZAJĘĆ I. Podstawowe pojęcia. Algorytm. Spis treści Przepis

Tworzenie i wykorzystanie usług

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Wywoływanie metod zdalnych

Wykład 4. Klasa List Kolejki Stosy Słowniki

Wywoływanie metod zdalnych

Programowanie Systemów Rozproszonych - WCF

Remote Method Invocation 17 listopada 2010

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Instrukcja konfigurowania poczty Exchange dla klienta pocztowego użytkowanego poza siecią uczelnianą SGH.

1. Wybierz File New Application. Pojawi się nowa aplikacja w Delphi.

Programowanie zespołowe

Wykład 6 Dziedziczenie cd., pliki

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Mechanizmy pracy równoległej. Jarosław Kuchta

Podejście obiektowe do budowy systemów rozproszonych

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C

Transkrypt:

Programowanie Systemów Rozproszonych Laboratorium 3 WCF Paweł Paduch paduch@tu.kielce.pl 12-04-2016

Rozdział 1 Wstęp 1.1 Materiały pomocniczne Do zajęć przydatne mogą być: materiały udostępniane przez prowadzących wykłady książki związane z tematyką programowania np. Język C# 2010 i platforma.net Andrew Troelsena książki związane z tematyką programowania współbieżnego np. Programowanie równoległe i asynchroniczne w C# 5.0 kursy i poradniki w sieci np. http://www.centrumxp.pl/ Tutoriale Microsoftu np. https://msdn.microsoft.com/en-us/library/ms731064(v=vs.110).aspx - na tym bazuje poniższa instrukcja. 1

Rozdział 2 Komunikacja dwukierunkowa - kontrakty Po zalogowaniu się z menu start odnajdujemy program Microsoft Visual Studio 2010, lub nowszy. 2.1 Service Contract Z górnego menu wybieramy: File-> New Project. W okienku jak na rysunku Rysunek 2.1: Okienko wybierania nowego projektu 2.1 zaznaczamy Visual C#->Windows WCF Service Library. Na dole wpisujemy nazwę projektu DuplexServiceLibrary i nazwę solucji Lab3, potwierdzamy OK. Powinny powstać nam 3 pliki: IService1.cs 2

Service.cs App.config Zmieniamy nazwę IService1.cs na IDuplexCalc.cs. W interfejsie definiujemy jakie operacje będzie udostępniać nasz serwis, (dodawanie, odejmowanie, mnożenie, dzielenie) ale też definiujemy jakie operacje może wywoływac u klienta. Będą to odpowiednio Wyświetlenie wyniku i wyświetlenie równania. 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.Serialization; 5 using System.ServiceModel; 6 using System.Text; 7 Listing 2.1: IDuplexCalc.cs 8 namespace DuplexServiceLibrary 9 { 10 [ServiceContract(SessionMode = SessionMode.Required, 11 CallbackContract = typeof(iduplexcalccallback))] 12 public interface IDuplexCalc { 13 [OperationContract(IsOneWay = true)] 14 void Wyczysc(); 15 [OperationContract(IsOneWay = true)] 16 void DodajDo(double n); 17 [OperationContract(IsOneWay = true)] 18 void OdejmijOd(double n); 19 [OperationContract(IsOneWay = true)] 20 void PomnozPrzez(double n); 21 [OperationContract(IsOneWay = true)] 22 void PodzielPrzez(double n); 23 } 24 25 public interface IDuplexCalcCallback 26 { 27 [OperationContract(IsOneWay = true)] 28 void Wynik(double result); 29 [OperationContract(IsOneWay = true)] 30 void Rownanie(string eqn); 31 } 32 } 2.2 Implementacja Kontraktu Zmieniamy nazwę pliku Service1.cs na DuplexCalc.cs Ustawiamy dziedziczenie DuplexCalc po IDuplexCalc. Można posłużyć się rozwijanym menu by wygenerować automatycznie odpowiednie metody. Implementujemy poszczególne metody jednocześnie implementując właściwość Calback zwracającą kanał zwrotny typu IDuplexCalcCallback Listing 2.2: Zaimplementowane metody w DuplexCalc.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.Serialization; 5 using System.ServiceModel; 6 using System.Text; 7 8 namespace DuplexServiceLibrary 3

9 { 10 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] 11 public class DuplexCalc : IDuplexCalc 12 { 13 14 double wynik = 0.0D; 15 string rownanie; 16 17 public DuplexCalc() 18 { 19 rownanie = wynik.tostring(); 20 } 21 22 public void Wyczysc() 23 { 24 Callback.Rownanie(rownanie + " = " + wynik.tostring()); 25 rownanie = wynik.tostring(); 26 } 27 28 public void DodajDo(double n) 29 { 30 wynik += n; 31 rownanie += " + " + n.tostring(); 32 Callback.Wynik(wynik); 33 } 34 35 public void OdejmijOd(double n) 36 { 37 wynik -= n; 38 rownanie += " - " + n.tostring(); 39 Callback.Wynik(wynik); 40 } 41 42 public void PomnozPrzez(double n) 43 { 44 wynik *= n; 45 rownanie += " * " + n.tostring(); 46 Callback.Wynik(wynik); 47 } 48 49 public void PodzielPrzez(double n) 50 { 51 wynik /= n; 52 rownanie += " / " + n.tostring(); 53 Callback.Wynik(wynik); 54 } 55 56 IDuplexCalcCallback Callback 57 { 58 get 59 { 60 return OperationContext.Current.GetCallbackChannel< IDuplexCalcCallback>(); 61 } 62 } 63 64 } 65 } 2.3 App.config Należy, zmienić nazewnictwo w pliku App.config z Service1 na DuplexCalculator oraz IService1 na IDuplexCalc. Zmienić też typ bindingu z BasicHttp- Binding na wsdualhttpbinding. Dodać sekcje bindings z definicją wsdualhttp- Binding wszystko jak na listeningu App.config 4

1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 Listing 2.3: App.config 4 <system.web> 5 <compilation debug="true" /> 6 </system.web> 7 <!-- When deploying the service library project, the content of the config file must be added to the host's 8 app.config file. System.Configuration does not support config files for libraries. --> 9 <system.servicemodel> 10 <services> 11 <service name="duplexservicelibrary.duplexcalc"> 12 <endpoint address="" binding="wsdualhttpbinding" contract=" DuplexServiceLibrary.IDuplexCalc" bindingconfiguration="duplexbinding"> 13 <identity> 14 <dns value="localhost" /> 15 </identity> 16 </endpoint> 17 <endpoint address="mex" binding="mexhttpbinding" contract="imetadataexchange" /> 18 <host> 19 <baseaddresses> 20 <add baseaddress="http://localhost:8733 /Design_Time_Addresses/DuplexServiceLibrary/DuplexCalculator/" /> 21 </baseaddresses> 22 </host> 23 </service> 24 </services> 25 <bindings> 26 <wsdualhttpbinding> 27 <binding name="duplexbinding" clientbaseaddress="http://localhost:8000 /DuplexCalc/"/> 28 </wsdualhttpbinding> 29 </bindings> 30 <behaviors> 31 <servicebehaviors> 32 <behavior> 33 <!-- To avoid disclosing metadata information, 34 set the value below to false before deployment --> 35 <servicemetadata httpgetenabled="true"/> 36 <!-- To receive exception details in faults for debugging purposes, 37 set the value below to true. Set to false before deployment 38 to avoid disclosing exception information --> 39 <servicedebug includeexceptiondetailinfaults="true" /> 40 </behavior> 41 </servicebehaviors> 42 </behaviors> 43 </system.servicemodel> 44 45 </configuration> 2.4 Pierwsze uruchomienie Już teraz można uruchomić nasz serwis wciskając F5. Serwis będzie hostowany w środowisku uruchomieniowym, włączony zostanie też prosty klient do testowania rozwiązań (rys. 2.2). 2.5 Hostowanie serwisu Stworzymy sobie prostą aplikację konsolową hostującą nasz serwis. 1. Dodaj do solucji nowy projekt typu Console Application i nazwij ją DuplexServiceHost. 5

Rysunek 2.2: WCF Test Client 2. We właściwościach projektu zmień Target framework na.net Framework 4.5 (rys. 2.3). Projekt zostanie przeładowany. 3. Dodaj referencję do DuplexServiceLibrary. W solution explorerze prawym klawiszem myszy na klikamy na References i wybieramy Add reference. Wybieramy z menu z lewej strony Solution -> Projects i zaznaczamy DuplexServiceLibrary (rys. 2.4). Dzięki temu aplikacja będzie znała typy używane w projekcie serwisu. 4. Dodaj referencję do System.ServiceModel. Podobnie jak wyżej, tylko należy wybrać nie Solution a Assemblies->Framework i tam zaznaczyć System.ServiceModel. Uzupełnij kod w pliku Program.cs jak na listingu?? Listing 2.4: Główny program hostujący serwis 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.ServiceModel; 5 using System.ServiceModel.Description; 6 using System.Text; 7 using DuplexServiceLibrary; 8 9 namespace DuplexServiceHost 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 // Tworzymy adres pod którym będzie dostępna usługa 16 Uri baseaddress = new Uri("http://localhost:8001/DuplexCalcService/"); 17 18 // Tworzymy obiekt klasy DuplexCalc 19 ServiceHost selfhost = new ServiceHost(typeof(DuplexCalc), baseaddress); 20 21 try 22 { 23 // Dodajemy Endopoint usługi 24 25 selfhost.addserviceendpoint(typeof(iduplexcalc), new WSDualHttpBinding(), "CalculatorService"); 6

Rysunek 2.3: Właściwości projektu Rysunek 2.4: Dodanie referencji do serwisu 7

26 27 // Umożliwiamy wymianę metadanych 28 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 29 smb.httpgetenabled = true; 30 // Umożliwiamy przesłanie dodatkowych danych na temat wyjątku 31 selfhost.description.behaviors.find<servicedebugbehavior>(). IncludeExceptionDetailInFaults = true; 32 selfhost.description.behaviors.add(smb); 33 34 35 // Startujemy serwis 36 selfhost.open(); 37 Console.WriteLine("Serwis działa..."); 38 Console.WriteLine("Naciśnij <ENTER> by zakończyć."); 39 Console.WriteLine(); 40 Console.ReadLine(); 41 42 // zamykamy serwis 43 selfhost.close(); 44 } 45 catch (CommunicationException ce) 46 { 47 Console.WriteLine("Przechwyciłem wyjątek: {0}", ce.message); 48 selfhost.abort(); 49 } 50 } 51 } 52 } W linii 25 tworzymy Endpoint serwisu. Jest on złożony z adresu, bindingu oraz kontraktów. Kontrakt to IDuplexCalc. Binding to WSDualHttpBinding, który jest predefiniowanym bindingiem, umożliwia on komunikację dwustronną. Od wersji.net 4.0 podawanie bindingu nie jest wymagane. Zostanie on automatycznie wygenerowany dla wszystkich par bazowy adres i kontrakt. W linii 28 umożliwiamy wymianę metadanych serwisu. Klienci używają metadanych do wygenerowania proxy służących do komunikowania się z serwisem. Należy: stworzyć obiekt klasy ServiceMetadataBehavior ustawić jego parametr HttpGetEnabled na true dodać zachowanie (behavior) do kolekcji System.ServiceModel.ServiceHost.Behaviors. W lini 31 umożliwiamy przesyłanie błędów z serwisu do klienta. W linii 36 otwieramy host do nasłuchiwania przychodzących komunikatów. Ustawiamy projekt DuplexServiceHost jako StartUp Project i uruchamiamy. Możemy uruchomić przeglądarkę i wejść na adres: http://localhost:8001/duplexcalcservice/. Powinniśmy zobaczyć linki do plików WSDL oraz przykład prostego klienta. 2.6 Klient Klient korzysta z klas proxy wygenerowanych na podstawie metadanych. Metadane często są w postaci pliku WSDL (plik xmlowy opisujący web service). Klasy proxy można wygenerować za pomocą narzędzia Svcutil.exe dostępnego z konsoli Visual Studio Command Prompt lub z poziomu Visual Studio. 8

Rysunek 2.5: Serwis w przeglądarce 9

1. Dodaj nowy projekt typu aplikacja konsolowa o nazwie DuplexCalcClient do solucji Lab3. 2. Ustaw we właściwościach projektu Target Framework na.net 4.5 3. Dodaj referencje do System.ServiceModel 4. Dodaj dodaj referencje do serwisu. W tym celu należy: Uruchomić program CalculatorHost tak by serwis działał i wystawił metadane na adresie http://localhost:8001/duplexcalcservice/. Należy uruchomić w trybie bez debugowania (ctrl+f5). Prawym klawiszem myszy kliknąć w solution explorerze na References w projekcie DuplexCalcClient i wybrać Add Service Reference. podać adres serwisu i nacisnąć guzik Go. po odkryciu naszego serwisu podajemy nazwę przestrzeni nazw DuplexCalcServiceRef (rys. 2.6) i naciskamy OK. Rysunek 2.6: Dodaj referencje do serwisu zostanie wygenerowany kod do klas proxy oraz plik konfiguracyjny app.config. 5. Jeżeli chcielibyśmy użyc narzędzia Svcutil.exe należałoby podać mniej więcej taką komendę: svcutil.exe /language:cs /out:generatedproxy.cs /config:app.config http://localhost:8001/duplexcalcservice/ 10

6. W kodzie musimy stworzyć klasę implementującą wywołania serwisu na kliencie CallbackHandler. Są tam dwie metody Wynik i Rownanie. Serwis za każdym razem gdy wołamy metodę liczacą, wywołuje u klienta metodę zwracająca wynik. 7. Uzupełniamy kod programu o odpowiednią przestrzeń nazw oraz tworzymy obiekt klasy DuplexCalcClient wołamy metody operujące na kalkulatorze np DodajDo czy PomnozPrzez jak listeningu (2.5) Listing 2.5: Calculator Client 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.ServiceModel; 5 using System.Text; 6 using DuplexCalcProgram.DuplexCalcServiceRef; 7 8 namespace DuplexCalcProgram 9 { 10 11 public class CallbackHandler : IDuplexCalcCallback 12 { 13 public void Wynik(double result) 14 { 15 Console.WriteLine("Wynik({0})", result); 16 } 17 18 public void Rownanie(string eqn) 19 { 20 Console.WriteLine("Równanie({0})", eqn); 21 } 22 } 23 class Program 24 { 25 static void Main(string[] args) 26 { 27 28 InstanceContext instancecontext = new InstanceContext(new CallbackHandler ()); 29 30 DuplexCalcClient client = new DuplexCalcClient(instanceContext); 31 client.open(); 32 client.dodajdo(5.0); 33 client.dodajdo(3.0); 34 client.pomnozprzez(2.0); 35 client.podzielprzez(4.0); 36 client.odejmijod(1); 37 client.wyczysc(); 38 Console.ReadLine(); 39 40 client.close(); 41 } 42 } 43 } 11

Rozdział 3 Zadania do samodzielnego wykonania Dodać do Callbacku wątek, który co sekundę woła metodę u klienta (licznik- Stan), która przekaże mu stan licznika. Licznik powinien startować od pierwszej operacji wykonanej na serwisie i zatrzymywać się za pomocą innej zdalnej metody np licznikstop. 12