BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











WCF w praktyce. Część 3 - Klient - korzystamy z usługi

15-10-2010 00:50 | Maciej Grabek
Trzeci artykuł serii poświęconej Windows Communication Foundation "WCF w praktyce". Tym razem przyjrzymy się procesowi tworzenia klienta i korzystania z usługi.

W części drugiej serii "WCF w praktyce" udostępniliśmy naszą usługę tworząc hosta. Dla przypomnienia, stworzyliśmy dwa projekty umożliwiające hostowanie kontraktu IGreetingService poprzez aplikację konsolową oraz poprzez plik serwisu webowego (*.svc). Z racji na zdecydowaną przewagę zalet tej drugiej opcji, w dalszej części będę korzystał z hostowania poprzez IIS (lub wbudowany w Visual Studio serwer WWW).

W trzeciej części naszym celem będzie skorzystanie z utworzonej i hostowanej wcześniej usługi. Sposób tworzenia klienta serwisu WCF jest identyczny dla różnych projektów (aplikacja konsolowa, okienkowa, czy też webowa), dlatego w przykładach będę korzystał z aplikacji konsolowej. Zatem do dzieła! Tworzymy nowy projekt korzystając z szablonu Console Application o nazwie SampleServiceClient. Aby mieć możliwość korzystania z funkcjonalności oferowanych przez naszą usługę, musimy dodać do niej referencję. Nie chodzi tu o referencję do projektu SampleServiceLibrary, lecz o referencję do usługi hostowanej przez serwer WWW. Żeby to zrobić musimy uruchomić projekt SampleServiceWebHost a konkretniej plik GreetingService.svc poprzez wybranie z jego menu kontekstowego opcji View in browser.

View in the browser

Serwis działa, czego dowodem jest strona otworzona w przeglądarce z informacjami o serwisie. Nie pozostaje nic innego jak tylko skopiować jego adres z przeglądarki (w moim przypadku jest to http://localhost:5000/GreetingService.svc) i wykorzystać go przy dodawaniu referencji. Robimy to przy pomocy opcji z menu kontekstowego  wybierając "Add service reference".
Add service reference

W okienku w polu adresu wpisujemy url widniejący w przeglądarce oraz klikamy przycisk GO. Jest również możliwość zaprzęgnięcia Visual Studio do przeszukania naszej solucji pod kątem serwisów. W przypadku gdy projekt serwisu i klienta są rozdzielone, ta druga opcja jest mało przydatna, zatem polecam korzystanie z adresów.
Add reference

Zatrzymam się jeszcze chwilę przy tym oknie. W lewym dolnym rogu mamy możliwość dostać się do opcji zaawansowanych, które pozwalają dostosować generowane proxy. Najważniejszą opcją jaką tu widzimy jest możliwość wygenerowania asynchronicznych metod.
Add reference advanced

Na marginesie dodam jeszcze, że we właściwościach projektu SampleServiceWebHost w zakładce Web ustawiłem na stałe port na 5000, żeby mieć pewność, że za moment nie dostanę błędu o niedostępności serwisu tam, gdzie wcześniej był :)
Wróćmy jednak do głównego wątku. Dla pokazania obu przypadków do projektu dodaję dwie referencje do naszego przykladowego serwisu: SampleServiceReference oraz AsyncSampleServiceReference. Jak sama nazwa wskazuje, druga referencja zawiera wygenerowane metody asynchroniczne. Dodanie referencji powoduje modyfikację pliku app.config (dla aplikacji webowych oczywiście będzie to web.config). Z racji faktu, że odwołujemy się do tego samego serwisu zrobiłem tam trochę porządków, które będziecie mogli zobaczyć po porbraniu kodu dołączonego do artykułu. Przejdźmy zatem do samego korzystania z klienta. Jak już wspomniałem, można wywołać usługę synchronicznie i asynchronicznie. W pierwszym przypadku niezbędny kod wygląda jak na listingu1.

[Kod]Listing1 Wywołanie synchroniczne.
private static void SyncCall()
{
Console.WriteLine("SyncCall");
try
{
using (SampleServiceReference.GreetingServiceClient client =
new SampleServiceReference.GreetingServiceClient("BasicHttpBinding_IGreetingService"))
{
SampleServiceReference.GreetingResponse response =
client.SayHi(new SampleServiceReference.GreetingRequest() { Name = "Maciek" });
Console.WriteLine(response.Message);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception" + ex.ToString());
}
}

Należy oczywiście pamiętać o używaniu klauzuli try-catch oraz tworzeniu obiektu klienta w obrębie using. Drugim sposobem jest odwołanie asynchroniczne. W tym przypadku musimy stworzyć handler, który będzie wywoływany w momencie otrzymania przez klienta odpowiedzi z serwisu (client_SayHiCompleted). Niezbędny kod widnieje na listingu 2.

[Kod]Listing 2 Wywołanie asynchroniczne.
private static void AsyncCall()
{
Console.WriteLine("AsyncCall (wait for me)");
try
{
using (AsyncSampleServiceReference.GreetingServiceClient client =
new AsyncSampleServiceReference.GreetingServiceClient("BasicHttpBinding_IGreetingService"))
{
client.SayHiCompleted += new EventHandler<AsyncSampleServiceReference.SayHiCompletedEventArgs>(client_SayHiCompleted);
client.SayHiAsync(new AsyncSampleServiceReference.GreetingRequest() { Name = "Maciek" });
}
}
catch (Exception ex)
{
Console.WriteLine("Exception" + ex.ToString());
}
}

static void client_SayHiCompleted(object sender, AsyncSampleServiceReference.SayHiCompletedEventArgs e)
{
Console.WriteLine("Async received");
if (e.Error != null)
{
Console.WriteLine("Exception " + e.Error.ToString());
}
else
{
Console.WriteLine(e.Result.Message);
}
}

W referencji "asynchronicznej" pojawiają się dodatkowe metody - SayHiAsync, która wywołuje serwis, natomiast po otrzynianiu wiadomości zwrotnej jest wywoływane zdarzenie SayHiCompleted (pod które podpinamy handler). Jest też możliwość wykorzystania metod BeginSayHi i EndSayHi, które są wygodne w przypadku aplikacji webowych, gdyż zwracają IAsynchResult, który można zarejestrować w momencie zdarzenia na stronie. Nie pozostaje nic innego jak uruchomienie klienta (pamiętając o tym, że usługa musi być włączona), którego wynik prezentowany jest na rysunku.
Client result

Jak widać wywołanie synchroniczne działa w przewidywany sposób, jednakże asynchroniczne wysyła żądanie, a następnie oddaje użytkownikowi kontrolę nad aplikacją ("Finished"). Dopiero później do klienta dociera odpowiedź i jest ona obsługiwana. Rozwiązanie to jest przydatne w przypadku długich operacji i konieczności ciągłej responsywności interfejsu.

Istnieje jeszcze jedna metoda wygenerowania kodu proxy do połączenia z serwisem. Do tego służy svcutil.exe. Biorąc pod uwagę wygodę korzystania z Visual Studio sądzę, że jest to sposób niszowy, jeżeli w ogóle przez kogoś używany. Dla porządku wywołanie to wygląda następująco:
svcutil.exe adresSerwisu /out:nazwaPliku.cs /config:(app|web).config
W wyniku otrzymujemy plik proxy i plik konfiguracyjny, które możemy zaimportować do projektu.

Tak oto dotarliśmy do trzeciego elementu trójkąta SOA. Wcześniej stworzyliśmy kontrakt usługi, hosta, a dziś klienta, dzięki czemu projekt jest w pełni funkcjonalny. Nie oznacza to oczywiście końca cyklu, wręcz przeciwnie - to dopiero początek! Na celowniku jest już WcfTestClient.
Dla przypomnienia linki do poprzednich artykułów:
WCF w praktyce. Część 1 - Wstęp. Kontrakt - definiujemy usługę
WCF w praktyce. Część 2 - Host - udostępniamy usługę

Kod aplikacji

Maciej Grabek
Maciej Grabek
Pasjonat technologii oferowanych przez Microsoft , współzałożyciel i lider Toruńskiej Grupy Deweloperów .NET. Na codzień programista .NET w jednej z największych firm e-commerce w Polsce.

Podobne artykuły

Komentarze 3

Maciej Rogoziński
Maciej Rogoziński
0 pkt.
Nowicjusz
28-10-2010
oceń pozytywnie 0

 

Hej, czy na ostatnich dwóch listingach nie brakuje wywołania metody client.Open() na każdym z klientów?

 

Maciej Grabek Redaktor
Maciej Grabek
12328 pkt.
Guru
MVP
28-10-2010
oceń pozytywnie 0

Nie ma takiej potrzeby. Po klauzuli using klient przechodzi w stan Created, natomiast wywołanie jakiejkolwiek metody serwisu powoduje przejście w stan Opened.

Możesz to sprawdzić ustawiając pulapki przy debugowaniu na wywołanie metody i na linię dalej czyli na Console.WriteLine - w ImmediateWindow podejrzyj wartość client.State.

Maciek

Jeżeli odpowiedź okazała się pomocna kliknij [Pomógł mi]

BLOG

biz
biz
176 pkt.
Junior
biz
31-12-2010
oceń pozytywnie 0

Warto by było wspomnieć przy okazji omawiania podłączania klienta do serwisów WCF o ChannelFactory. Z całym szacunkiem, ale kto używa w produkcyjnych systemach generowania proxy przez te wizardy z VS? To fajnie wyglądą w tutorialach i helpach, ale jest mało praktyczne.

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.