Komunikacja ze światem usług Udostępnij na: Facebook

Autor: Rafał Garbowski

Opublikowano: 2010-10-13

Wstęp

Silverlight to nie tylko piękna grafika i style, różnorodne animacje i efekty. Tak jak każdy program, aplikacja Silverlight wykonuje określone zadania, wykorzystując metody do operacji na danych. Dzięki protokołowi SOAP, nasza aplikacja może łatwo wywoływać znajdujące się w sieci zdalne metody, zwane Web Services. Podobnie jak strony internetowe, Web Services są dostępne za pośrednictwem serwera sieci Web, np. IIS. Komunikacja z klientem odbywa się za pomocą wiadomości kodowanych w XML.

W tym artykule dowiesz się:

– jak połączyć aplikację Silverlight z serwisem WCF za pośrednictwem protokołu SOAP,

– jak umożliwić komunikację między domenami (cross-domain),

– na czym polega komunikacja WCF polling duplex.

Jak połączyć aplikację Silverlight z serwisem WCF?

Dodanie referencji do projektu

Aby połączyć naszą aplikację z serwisem WCF, wystarczy dodać referencję. Klikamy prawym przyciskiem myszy na „References” i wybieramy „Add Service Reference”.

W polu „Address” wpisujemy adres serwisu WCF lub klikamy na „Discover”, jeśli serwis znajduje się w naszym projekcie. W polu „Services” zaznaczamy interesujący nas serwis.

Możemy zmienić przestrzeń nazw lub dokonać zaawansowanych ustawień.

Jak odwołać się do serwisu WCF w kodzie CS?

Tworzymy klienta serwisu, którego klasa znajduje się we wcześniej zdefiniowanej przestrzeni nazw. Za pośrednictwem metod oferowanych przez naszego klienta wywołujemy usługi serwisu. Pamiętajmy, aby zawsze zamknąć klienta, używając metody „CloseAsync”.

Wszystkie metody wywoływane są asynchronicznie i aby otrzymać wynik, musimy przechwycić event ukończenia wykonywania usługi.

Jeśli usługi oferowane przez Web Service ulegną zmianie, należy pamiętać o aktualizacji referencji.

Komunikacja Cross-Domain

Domyślnie Silverlight wspiera tylko żądania do serwisu usług znajdującego się na witrynie, z której pochodzi. Wywołania muszą używać tej samej domeny, portu i protokołu. Przeciwdziała to nieautoryzowanym wywołaniom usług na innych domenach.

Schemat przedstawia wywołania usług z różnych adresów przez klienta Silverlight, znajdującego się pod adresem „http://subdomena.mojastrona.pl”. Na czerwono oznaczono wywołania błędne.

Aby umożliwić dostęp klienta Silverliight z zewnętrznego serwera do naszego serwisu usług, musimy umieścić na naszym serwerze plik o nazwie „clientaccesspolicy.xml” lub plik Adobe Flash „crossdomain.xml”.

Należy pamiętać, aby plik clientaccesspolicy.xml znajdował się w głównym folderze serwera, np. https://localhost:4302/clientaccesspolicy.xml. Oto przykład pliku clientaccesspolicy.xml:

Parametr „domainuri” równy ”*” oznacza, że dostęp do serwisu WCF jest możliwy ze wszystkich domen.

Komunikacja WCF Polling Duplex

Dotychczas rozpatrywaliśmy komunikację typu „żądanie-odpowiedź”, gdzie klient Silverlilght wywołuje daną usługę, natomiast serwis WCF wysyła mu odpowiedź. Aby wzbogacić porozumiewanie się o możliwość zainicjowania komunikacji przez serwis WCF, musimy użyć WCF polling duplex.

Implementacja po stronie serwera

Wyobraźmy sobie, że chcemy powiadomić klienta o nowej wiadomości na czacie. Klasę, która będzie odpowiadała za wysyłanie wiadomości do serwisu itp., dekorujemy, podając typ kontraktu, który będzie zawierał metody do komunikacji odwrotnej.

Metody interfejsu „IDuplex” dekorujemy,  ustawiając komunikację tylko w jedną stronę, gdyż jedynie taka jest obsługiwana przez Silverlight 4.

Wysłanie wiadomości do klienta wymaga utworzenia obiektu typu „IDuplex”, czyli interfejsu obsługującego WCF polling duplex. Argumenty metod wywoływanych za pomocą tego obiektu trafiają do klienta.

Silverlight 4 wspiera komunikację duplex za pośrednictwem HTTP lub TCP. Wybraną przez nas metodę komunikacji – uzależnioną zwykle od infrastruktury połączenia – definiujemy w pliku „web.config” poprzez sprecyzowanie endpointów serwisu i bindingu. TCP.NET Binding działa na ograniczonej liczbie portów oraz nie wspiera bezpiecznego połączenia. Polling Duplex HTTPBinding jest bardziej uniwersalny, gdyż korzysta ze standardowego protokołu HTTP, który nie jest blokowany przez infrastrukturę sieciową.

Implementacja po stronie klienta

W przypadku komunikacji przez TCP tworzymy obiekt klienta, używając konstruktora domyślnego (bez parametrów), natomiast dla Polling Duplex HTTP Binding podając w parametrach rodzaj Windingu i adres serwisu WCF.

Aby odczytać wiadomości wysyłane przez serwis WCF, tworzymy event handler dla eventu o nazwie „NazwaMetodyReceived”.

Zarówno do serwera, jak i do klienta musimy dołączyć odpowiednie biblioteki, w tym:

Podsumowanie

W celu komunikacji z serwisem WCF dodajemy referencję i używamy zdefiniowanej przestrzeni nazw. Komunikacja między domenami, szczególnie za pomocą socketów, wymaga zdefiniowania polityki dostępu klienta Silverlight do serwisu WCF. Silverlight 4 wspiera, łatwą do implementacji, komunikację WCF polling duplex za pomocą protokołu HTTP lub TCP.