Komponentowe Systemy Rozproszone 2011/2012 Instrukcja laboratoryjna cz.7 Model programistyczny WCF cz.2 Prowadzący: Tomasz Goluch Wersja: 2.3
I. Publikacja serwera WCF Cel: Publikacja aplikacji WCF na serwerze IIS. Załóż darmowe konto IIS, lista przykładowych usługodawców: www.somee.com, www.brinkster.com, www.aspspider.com, www.x10hosting.com. Otwórz projekt zadania domowego z laboratorium WCF1. W celu publikacji projektu na nowym serwerze wybierz: Projekt PPM Publish Dodaj następujące ustawienia: Publish method: = FTP, Target Location: = adres uzyskany od usługodawcy IIS/Główny katalog projektu 1, Passive mode = odznaczone, User name: = login dostępowy do serwera IIS, Password: = hasło dostępu do serwera IIS. Wybierz: Publish. 1 W Target Location należy podać pełną ścieżkę dostępu składającą się z adresu serwera wraz ze ścieżką dostępową w strukturze katalogów usługodawcy. Przykładowo usługodawca somee.com wymaga podania katalogu o identycznej nazwie jak nazwa domeny. Strukturę katalogów usługodawcy można sprawdzić dowolnym klientem FTP np.: FileZillą.
Aby zaktualizować referencję do serwisu w kliencie, należy podać jego adres (np.: http://student.somee.com/service1.svc). Zaprezentuj działanie klienta z nowo opublikowanym serwerem WCF. II. WCF Serwer (.exe) komunikacja. Cel: Implementacja prostego serwera WCF w pliku wykonywalnym (.exe) i korzystającego z jego usług, poprzez różne rodzaje protokółu klienta. Laboratorium ze względu na wymagania odnośnie uprawnień administratora odbywa sie na maszynie wirtualnej. Uruchomić maszynę wirtualną: Start Windows Virtual PC XP_VS_MSSQL_ADW user: student1, hasło: student. Uruchom Visual Studio z prawami administratora. Utwórz nowy WCF Service Library (Visual C#). Deklaracja kontraktu usługi: Implementacja kontraktu: Dodać nową metodę do kontraktu (obliczanie silni, pierwiastka, ). W celu hostowania usługi należy dodać nowy projekt Console Application (Visual C#) do istniejącego solution. Nie zamykaj wcześniejszego projektu. Ustaw projekt jako domyślny: Project Set as StartUp Project. Dodaj referencję do : Project Add Reference....NET System.ServiceModel OK. Dodaj wymaganą przestrzeń nazw:
Dodaj zwykłą (nie serwisową!!!) referencję do Serwisu WCF (zaimplementowanego wcześniej). Utworzenie hosta: Service1Client typ klasy implementującej udostępniane interfejsy. podany adres adres bazowy dla podanych później adresów. Endpoint to trójka: interfejs (np. Service1), binding kanał komunikacyjny (HTTP, TCP, pipe, MSMQ itp.), adres usługi (np. http://localhost:1100/service1). Host może mieć wiele endpointów, byle różniły się adresami. Host może udostępniać ten sam interfejs przez różne endpointy. Host może udostępniać różne interfejsy (o ile serwer je implementuje). Dodanie endpointa z metadanymi (opisem pozostałych endpointów): Opis parametrów: ServiceMetadataBehaviour.MexContractName typ udostępnianego interfejsu, MetadataExchangeBindings.CreateMexHttpBinding() opis kanału komunikacyjnego, mex adrese usługi (względem adresu bazowego). Wymagana przestrzeń nazw: Dodanie endpointa z usługą:
Opis parametrów: IService1 typ udostępnianego interfejsu, new BasicHttpBinding() opis kanału komunikacyjnego, adres dokładny adres usługi (może być pełny lub względem adresu bazowego). Uruchomienie serwisu: Zakończenie pracy serwera wymaga naciśnięcia dowolnego klawisza (należy cierpliwie poczekać może to trochę potrwać). Należy utworzyć nowy projekt klienta (analogicznie jak w cz. 1 laboratorium WCF). Należy upewnić się, że serwer jest uruchomiony (np. w osobnym oknie 2 ). Dodając referencję do serwisu należy podać adres wpisany w serwerze (np. http://localhost:1100/service1, Visual poszuka endpointa o adresie http://localhost:1100/service1/mex i z niego pobierze dane). Przykładowy wynik działającego klienta: W celu zmiany komunikacji z kanału komunikacyjnego z HTTP na nazwane potoki należy: zmienić adres endpointa np.: jeżeli chcemy, żeby metadane były też udostępniane przez nazwane potoki, także w tym endpoincie należy dokonać zmian: zmienić binding endpointa, w naszym przypadku na: 2 W celu uniknięcia problemów z edycją projektu klienta nie uruchamiaj serwera z poziomu Visual Studio tylko z wiersza poleceń (Uruchom jako administrator).
jeżeli zmienił się adres metadanych, należy dodać na nowo referencję do serwisu w kliencie (Update Service Reference). Proszę zaprezentować prowadzącemu program klienta współpracującego z serwerem poprzez protokół http oraz poprzez potoki nazwane. III. Czas życia serwera WCF. Cel: Zapoznanie się z różnymi rodzajami czasu życia serwera WCF.. Proszę dodać do serwera metodę zwracającą liczbę, która zwiększa się po każdym wołaniu oraz możliwość wyświetlenia jej w kliencie. Czas życia serwera można kontrolować, dodając do klasy serwera atrybut gdzie XXX to: PerCall (domyślnie) nowy serwer na każde wołanie metody, PerSession nowy serwer na każdego utworzonego klienta, w tym przypadku do atrybutu ServiceContract interfejsu należy dodać parametr: lub: które umożliwiają wykorzystanie sesji 3. Single jeden serwer dla wszystkich w tym przypadku można (ale nie trzeba) jako pierwszy parametr konstruktora ServiceHost podać nie typ a instancję obiektu serwera wtedy to podany obiekt będzie realizował wołane operacje. Zaprezentuj prowadzącemu różnice pomiędzy ServiceContextMode: PerCall, PerSession oraz Single. W przypadku ServiceContextMode.Single proszę przekazać do hosta gotowy obiekt z wartością początkową zwracanych liczb równą 100. Przykładowy interfejs może wyglądać następująco: IV. Wołania zwrotne serwera WCF. Cel: Implementacja wołania zwrotnego z serwera do klienta WCF.. 3 BasicHttpBinding nie obsługuje sesji; należy użyć w tym przypadku WSHttpBinding
Klient może udostępnić serwerowi interfejs, przez który serwer może go powiadamiać. W takim przypadku w serwerze należy: zadeklarować interfejs, który będzie udostępniał klient: interfejs nie powinien mieć atrybutów, lecz jego metody powinny mieć atrybut: który oznacza, że metoda jest jednokierunkowa (musi zwracać voida), dodać parametr atrybutu ServiceContract w interfejsie serwisu: gdzie: CallbackInterface to nazwa zadeklarowanego wcześniej interfejsu, metoda serwera wołająca metody interfejsu zwrotnego powinna także być jednokierunkowa 4 (atrybut: ) i zwracać voida. aby otrzymać interfejs zwrotny w metodzie serwera, należy: UWAGA: interfejsy zwrotne są obsługiwane przez NetNamedPipeBinding() i WSDualHttpBinding. W elemencie services pliku konfiguracyjnego app.config należy zmienić binding na: W kliencie należy: zaktualizować referencję do serwisu 5, interfejs zwrotny będzie widziany pod nazwą NazwaUsługiCallback, napisać klasę implementującą interfejs zwrotny, do klienta podać obiekt, opakowany w InstanceContext, który będzie obsługiwał wołania zwrotne: Wymagana przestrzeń nazw: Zaprezentuj prowadzącemu działanie wołania zwrotnego serwera. V. Komunikacja serwera WCF poprzez kolejkę MSMQ. Cel: Konfiguracja komunikacji klient-serwer WCF poprzez kolejki MSMQ. W celu zainstalowania usługi kolejkowania wiadomości (Windows 7) wybierz: Panel sterowania Włącz lub wyłącz funkcje systemu Serwer usługi MSMQ Podstawowe funkcje serwera usługi MSMQ Zaznacz OK. 4 Atrybutem należy opatrzyć deklarację metody w interfejsie serwera. 5 Pamiętaj aby uruchomić serwer (ale nie z poziomu Visual Studio).
Zarządzanie kolejkami prywatnymi: Uruchom compmgmt.msc /s Zarządzanie komputerem usługi i aplikacje kolejkowanie wiadomości kolejki prywatne. W aplikacji hostującej dodaj referencję do: Project Add Reference....NET System.Messaging OK. Dodaj przestrzeń nazw: Nazwy kolejek: kolejka publiczna 6, kolejka prywatna. Tworzenie i usuwanie kolejki: podanie drugiego parametru z wartością true tworzy kolejkę transakcyjną, usunięcie kolejki, pytanie o istnienie kolejki. Adresy mają postać:. Komunikacja musi być jednokierunkowa: Przez MSMQ nie można udostępniać metadanych. Wołanie metod przez klienta nie wymaga uruchomionego serwera (wołania trafią do kolejki, skąd później może je wydobyć serwer). Zaimplementuj metodę przesyłającą komunikat do serwera (powinien on zostać wyświetlony w oknie konsoli serwera WDF) 6 Kolejki publiczne możemy tylko tworzyć w oparciu usługę Active Directory wymagającą Windows Serwera.
Wywołanie metody w kliencie: Przykład działającego programu: Proszę zaprezentować prowadzącemu komunikację klient-serwer WCF poprzez kolejkę MSMQ.
Zadanie domowe z WCF cz.2: Zaimplementować grę Czwórki (Connect Four 7 ): gra dwóch graczy, plansza ustawiona pionowo o rozmiarach: 7 pól [szerokość] x 6 pól [wysokość], rozpoczyna ruszający żółtymi, piony wrzucane są po jednym na zmianę, wygrywa gracz który ułoży czwórkę (umieści cztery swoje piony w nieprzerwanym ciągu w pionie, poziomie bądź po skosie). Napisać system do gry w architekturze klient-serwer WCF. Serwer powinien być opublikowany u usługodawcy internetowego i udostępniać następujące funkcje: o Login() którą gracz wywołuje tę metodę bezpośrednio po podłączeniu się do serwera, aby dowiedzieć się, czy jest graczem pierwszym (jeżeli podłączył się jako pierwszy) czy drugi albo, że gra już się rozpoczęła. o Ruch(col) wykonanie ruchu wrzucenie pionka do jednej z siedmiu kolumn w przypadku niepoprawnego ruchu (zapełniona kolumna), serwer powinien rzucać klientowi wyjątek, serwer nie powinien przechowywać logiki gry, w celu wykonania posunięcia powinien kontaktować się z klientem WCF udostępniającym mu generator posunięć (serwer COM), którego wołanie powinno odbywać się za pomocą interfejsu zwrotnego. Serwer powinien pozwalać na podłączenie maksymalnie dwóch graczy, przy próbie podłączenia trzeciego powinien rzucać wyjątek. Zaimplementować klienta (gracza) w C# wybór interfejsu graficznego do wyboru: WPF, Windows Forms, konsola, inne..., pozwalającego na zalogowanie (przycisk loguj, ewentualnie z możliwością podania adresu serwera), wyświetlanie planszy, wykonywanie posunięć oraz wyświetlenie komunikatu informującego o zakończeniu gry (wyświetlenie informacji: wygrana/przegrana). Zaimplementować generator posunięć w C++ powinien on udostępniać następujące funkcje: o Ruch(col, p_wys, p_szer) wykonanie ruchu polegającego na wrzuceniu pionka do kolumny: col, wykonanie poprawnego posunięcia powoduje zwrócenie współrzędnych na których wylądował spadający pion: p_wys i p_szer, w przeciwnym wypadku funkcja powinna zwrócić błąd w H_RESULT. o Wynik(wyn) zwraca (-1) jeśli gra jeszcze się nie zakończyła, 0 remis, 1 jeśli wygrał gracz pierwszy, w przeciwnym przypadku zwraca 2 (wygrana gracza drugiego). Aby serwis WCF mógł korzystać z generatora posunięć (serwer COM w C++ ), należy zaimplementować klienta WCF w C# komunikującego się z serwerem i udostępniającego mu interfejs zwrotny umożliwiający odpytywać generator posunięć. Metody można rozbudowywać i dodawać nowe, Problem synchronizacji (który gracz w danym momencie wykonuje ruch) do samodzielnego rozwiązania. 7 Dokładny opis zasad gry: http://en.wikipedia.org/wiki/connect_four
Diagram komponentów: