Ten artykuł pochodzi z serii przygotowań do egzaminu 70-503: Windows Communication Foundation.
Wiemy już jak uruchomić nasz serwis na IIS. Jeśli nie chcemy do tego wykorzystywać IIS’a WCF daje nam możliwość hostowania serwisu w aplikacji konsolowej, usłudze systemowej, aplikacji Windows Forms, czy nawet WPF (ang. Windows Presentation Foundation). Dla prostych usług WCF zapewnia swoją aplikację hostującą (o niej będzie na końcu lekcji).
Aplikacja konsolowa
Najczęściej serwisy hostuje się w aplikacji konsolowej podczas ich tworzenia, mamy wtedy dostęp do wszelkich informacji o stanie aplikacji z okna konsoli. Uruchomienie usługi polega na utworzeniu obiektu klasy ServiceHost. W poprzednich lekcjach były pokazywane serwisy w aplikacji konsolowej więc ograniczę się tylko do przykładowego kodu:
1: static void Main(string[] args)
2: {
3: using (ServiceHost host = new ServiceHost(typeof(OrderService)))
4: {
5: host.Open();
6: Console.WriteLine("The OrderService is ready.\nPress a key to exit");
7: Console.ReadKey(true);
8: host.Close();
9: }
10: }
Oczywiście trzeba jeszcze w pliku app.config (plik należy dodać do projektu samemu, a raczej skopiować z projektu samego serwisu) dodać konfigurację serwisu.
Usługa Windows
Jeśli serwis nie wymaga interfejsu graficznego, a ma po prostu być sobie cały czas uruchomiony gdzieś w systemie to utworzenie Usługi Windows będzie najlepszym rozwiązaniem.
Usługę dodajemy do projektu z okna New Project, tak samo jak każdy rodzaj aplikacji:

Zanim zaczniemy cokolwiek pisać, musimy dodać referencje do biblioteki System.ServiceModel oraz do biblioteki System.Configuration.Install (używanej do instalacji usługi).
Visual Studio wygenerowało automatycznie kod nowej usługi Windows (który teraz musimy uzupełnić o uruchomienie naszego serwisu WCF), plik Service1.cs:
1: public partial class Service1 : ServiceBase
2: {
3: public Service1()
4: {
5: InitializeComponent();
6: }
7:
8: protected override void OnStart(string[] args)
9: {
10: }
11:
12: protected override void OnStop()
13: {
14: }
15: }
Dodajemy odpowiednie przestrzenie nazw do naszej przestrzeni:
1: using System.ServiceModel;
2: using System.ComponentModel;
3: using System.Configuration.Install;
4: using System.ServiceProcess;
Dodajemy pole do przechowywania obiektu klasy ServiceHost:
1: public ServiceHost serviceHost = null;
Uzupełniamy konstruktor usługi Windows oraz metody wykonywane przy uruchamianiu i zatrzymywaniu usługi Windows:
1: public Service1()
2: {
3: InitializeComponent();
4: ServiceName = "Usługa hostująca serwis WCF"; //nazwa wyświetlona na liście usług
5: }
6:
7: protected override void OnStart(string[] args)
8: {
9: if (serviceHost != null)
10: {
11: serviceHost.Close();
12: }
13: serviceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1));
14: serviceHost.Open();
15: }
16:
17: protected override void OnStop()
18: {
19: if (serviceHost != null)
20: {
21: serviceHost.Close();
22: serviceHost = null;
23: }
24: }
W metodzie OnStart uruchamiamy nasz serwis, w OnStop zatrzymujemy. Tyle wystarczy jeśli chodzi o samą usługę, ale teraz trzeba ją jakoś zainstalować. Aby usługa była “instalowalna” musimy dodać klasę dziedziczącą po klasie Installer:
1: [RunInstaller(true)]
2: public class ProjectInstaller : Installer
3: {
4: private ServiceProcessInstaller process;
5: private ServiceInstaller service;
6: public ProjectInstaller()
7: {
8: process = new ServiceProcessInstaller();
9: process.Account = ServiceAccount.LocalSystem;
10: service = new ServiceInstaller();
11: service.ServiceName = "Usługa hostująca serwis WCF";
12: Installers.Add(process);
13: Installers.Add(service);
14: }
15: }
Teraz możemy całość skompilować i zainstalować w systemie (z konsoli “Visual Studio Command Prompt”). W moim przypadku:
1: installutil c:\Temp\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe
Pamiętajcie żeby uruchomić konsolę z uprawnieniami administratora!

I mamy usługę (services.msc):

Po skończonej zabawie usuwamy usługę:
1: installutil /u c:\Temp\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe
Hostowanie serwisu przy użyciu WcfSvcHost.exe
Najprostsze jest uruchomienie serwisu za pomocą WcfScvHost.exe, wystarczy uruchomić tą aplikację podając jako parametry service i config:
1: WcfSvcHost.exe /service:c:\Temp\WindowsService1\WcfServiceLibrary1\bin\Debug\WcfServiceLibrary1.dll /config:c:\Temp\WindowsService1\WcfServiceLibrary1\bin\Debug\WcfServiceLibrary1.dll.config
Na tym zakończyliśmy na razie tworzenie serwisów WCF, w następnej lekcji przejdziemy do “konsumowania” czyli do korzystania z naszych serwisów.