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ęść 2 - Host - udostępniamy usługę

20-09-2010 00:58 | Maciej Grabek
Drugi artykuł z wyklu "WCF w praktyce" traktujący na temat hostowania usług.

W poprzednim artykule stworzyliśmy kontrakt usługi IGreetingService wraz z jej implementacją. Sama biblioteka nie jest przydatna, jeżeli nie będzie dostępna dla klientów. Przyszedł zatem czas, aby stworzyć projekt, który będzie ją hostował.

Istnieje kilka możliwości udostępnienia usługi i są to:
1) self hosting
2) hostowanie poprzez windows service
3) IIS / WAS

Pierwsze dwa sposoby są do siebie bardzo zbliżone i różnią się praktycznie metodą, w której umieszczamy kod uruchamiający serwis. Trzeci sposób, a właściwie trzeci i czwarty polegają na hostowaniu serwisów przy pomocy IIS'a i WAS (Windows Activation Services), które jest swego rodzaju uogólnieniem IIS.

Self Hosting i Windows Service

Przyjrzyjmy się zatem poszczególnym przykładom i zacznijmy od self hosting. W tym celu tworzymy aplikację konsolową o nazwie "SampleServiceSelfHost".

Rysunek 1. Nowa aplikacja konsolowa

Nowa aplikacja konsolowa


Kolejnym krokiem jest dodanie niezbędnych referencji:
1) Referencja do SampleServiceLibrary, czyli kontraktu naszej usługi
2) Referencja do System.ServiceModel, czyli podstawowej biblioteki WCF.

Rysunek 2. Referencje do bibliotek

Referencje do bibliotek

W tym momencie możemy przystąpić do kodowania. Aby uruchomić usługę należy wykorzystać fragment kodu widniejący na listingu 1.

Listing 1 Kod aplikacji

[Kod]
using System;
using System.ServiceModel;
using SampleServiceLibrary;
namespace SampleServiceSelfHost
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(GreetingService)))
{
host.Open();
Console.WriteLine("Press [Enter] to close");
Console.ReadLine();
}
}
}
}

Na koniec pozostaje skopiować jeszcze plik konfiguracyjny znajdujący się z pierwszym projekcie (czyli w SampleServiceLibrary), który zawiera wszystkie informacje dotyczące sposobu uruchomienia serwisu. Owszem, można umieścić całą konfigurację w kodzie, jednakże jest to rozwiązanie mało elastyczne, co czyni je, w mojej ocenie, niewygodnym do zastosowania produkcyjnego.

Uruchomienie tego kodu powoduje wystąpienie błędu widocznego na rysunku 3.

Rysunek 3. Błąd uruchomienia

Błąd uruchomienia

Jest to spowodowane faktem, że projekt utworzony przy użyciu szablonu WCF Service Library jest automatycznie hostowany przy pomocy WcfSvcHost - wbudowanego serwera testowego pozwalającego uruchamiać usługi w trakcie ich tworzenia. Jest to jedno z narzędzi, obok WcfTestClient, które znacząco poprawiają komfort pracy z WCF. Wracając do naszego projektu, to co należy zrobić, to zmiana nazwy lub zwyczajne usunięcie pliku App.config z projektu SampleServiceLibrary. Ja preferuję to pierwsze rozwiązanie ze względu na proste odtworzenie stanu pierwotnego projektu.

Sprawdźmy zatem jeszcze raz, czy zmiany przyniosły oczekiwany rezultat. Wynik widnieje na rysunku 4.

Rysunek 4. Uruchomiony serwis

Uruchomiony serwis

Pisałem, że self hosting niewiele różni się od hostowania przy pomocy serwisów windowsowych. W rzeczywistości to co musimy zrobić, to utworzenie hosta nie w metodzie Main, lecz w metodzie OnStart.

IIS/WAS

Przejdźmy zatem do kolejnej metody hostowania serwisów WCF jaką jest wykorzystanie IIS/WAS. Ogromną przewagą tego rozwiązania w stosunku do poprzedniego jest możliwość skorzystania z całego inwentarza, który niesie za sobą IIS (obsługa wyjątków, wznawianie usługi itp...). Jak zatem skorzystać z tych możliwości?

Pierwsze co należy zrobić to stworzyć aplikację webową korzystając albo z szablonu WCF Service Application w sekcji WCF lub też z ASP.NET Empty Web Application w sekcji Web. Sposób pierwszy jest o tyle wygodniejszy, że nie trzeba pamiętać o dodawaniu referencji do projektu i wystarczy poczyścić pliki zamiast tworzyć je na nowo. Zatem do dzieła. Zgodnie z rysunkiem 5 tworzymy aplikację o nazwie SampleServiceWebHost. To co otrzymaliśmy widać natomiast na rysunku 6.

Rysunek 5. Nowa aplikacja webowa

Nowa aplikacja webowa

Rysunek 6. Projekt WCF Service Application

Projekt WCF Service Application

Pora zatem przystąpić do porządków. Usuwamy zbędną definicję kontraktu (IService1.svc), oraz jego implementacje (Service1.svc.csv), a na koniec zmieniamy nazwę pliku z Service1.svc na GreetingService.svc. Kolejnym krokiem jest dodanie referencji do naszej biblioteki z kontraktem (SampleServiceLibrary) oraz skopiowanie jej konfiguracji do pliku Web.config. To czego możemy się z niej pozbyć, to na pewno sekcja <host> z wpisem baseAddress, gdyż będzie nim adres na którym zostanie uruchomiona nowo utworzona aplikacja webowa.
Ostatni etap to edycja pliku svc, który zawiera informację o tym, jaka usługa ma się pod nim kryć. Wpisując do niego dosłownie linijkę kodu widniejącą na listingu 2 mamy gotowy projekt hostujący naszą usługę!

Listing 2. Zawartość pliku svc.

[Kod]
<%@ ServiceHost Language="C#" Debug="true" Service="SampleServiceLibrary.GreetingService"%>

Dla sprawdzenia poprawności rozwiązania nie pozostaje nic innego jak jego uruchomienie, po którym naszym oczom ukazuje się strona jak na rysunku 7.

Rysunek 7. Wynik działania aplikacji webowej hostującej serwis WCF.

Wynik działania aplikacji webowej

W ten oto sposób zapoznaliśmy się z tym jak udostępnić przygotowaną przez nas usługę. Zagadnienie to jest oczywiście o wiele obszerniejsze niż tu przedstawiłem, jednakże mam nadzieję, że artykuł zainteresuje Was tematem oraz pokaże kierunek poszukiwań.

W kolejnej części cyklu zaprezentuję, w jaki sposób można skorzystać z tak udostępnionej usługi.

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 1

ogrod87
ogrod87
3 pkt.
Nowicjusz
02-09-2011
oceń pozytywnie 0

W artykule jest mowa o usunięciu host z configu. Warto by dodać, o którym configu mowa - czy o web, czy o app. Z tekstu wynika, że chodzi o plik Web.config, gdy usunąłem, to usługa nie odpowiada. Gdy zostawiłem w postaci 1:1 to wszystko jest ok :)
Ale artykuły świetne, sporo się można nauczyć.

pkt.

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