1

WCF pro začátečníky – 4. díl: hostování služby ve Windows Service

autor Kryštof Laryš | publikováno 10. března 2009


Čtvrtý díl je věnován hostování služby ve Windows Service. Vysvětlíme si přesný postup, jak takovýmto způsobem službu hostovat, jak ji nainstalovat do Windows Service a jak ji spustit.

Proč vůbec nechat hostovat službu zrovna ve Windows Service? Je to jeden ze zajímavých způsobů hostování, který je nám nabízen. Pokud nám nevyhovují vlastnosti IIS nebo máme starou verzi (třeba jako já), která nepodporuje jiný protokol, než HTTP, pak je Windows Service dobrá volba. Takováto služba se dá řídit jako všechny ostatní služby v systému. Dá se tedy spustit manuálně nebo automaticky, zastavit, pozastavit či restartovat. Rovněž se logují události, které se v této službě dějí, takže máme k dispozici log soubor k nahlédnutí.

Z minulého dílu už víme, jak vytvořit WCF Service Library a Klienta. Tyto dvě části také použijeme v novém projektu, ve kterém zakládáme Windows Service. Pokud už máme tyto dva prográmky vytvořeny, vrhneme se na další část.

Založíme si projekt Windows Service, který najdeme v záložce Windows, a pojmenujeme si jej WindowsService_Host. Otevře se nám designer třídy Service1.cs a my v pravé části, kde jsou Properties, nastavíme jméno na WCFSerialHost a ServiceName rovněž na WCFSerialHost. Dle vlastního uvážení můžete přenastavit i ostatní vlastnosti, které na naši práci nemají vliv.

Nyní musíme přidat referenci WCF Service Library, abychom s ní mohli pracovat. Postup už opět víme z minulého dílu. Budeme ale potřebovat ještě referenci na ServiceModel. Přidáme si ji. Taktéž si zkopírujeme App.config z WCF Service Library do projektu WindowsService_Host a otevřeme si Properties projektu, kde nastavíme Startup object na WindowsService_Host.Program.

Jako další věc musíme naprogramovat logiku metod OnStart a OnStop neboli toho, co se bude dít, když službu spustíme a když ji zastavíme. Otevřeme si tedy kód souboru Service1.cs a nahradíme ho tímto kódem:

				using System.ServiceProcess;
using System.ServiceModel;
using WcfServiceLibrary1;
namespace WindowsService_Host
{
    public partial class WCFSerialHost : ServiceBase
    {
        private readonly ServiceHost host;
        public WCFSerialHost()
        {
            InitializeComponent();
            host = new ServiceHost(typeof(Service1));
        }
        protected override void OnStart(string[] args)
        {
            host.Open();
        }
        protected override void OnStop()
        {
            host.Abort();
            host.Close();
        }
    }
}


Z kódu můžeme vysledovat, že v konstruktoru Windows Service se vytvoří instance služby úplně stejně, jako tomu bylo v konzolové hostovací aplikaci. V metodě OnStart se služba spustí a v metodě OnStop se zastaví. Nic víc, nic míň. Jediné, co by vám mohlo přijít divné je, proč jsem u uzavírání služby připsal ještě zrušení (Abort). Je to z jednoduchého důvodu. Pokud bych službu před uzavřením nezrušil, tak pokud by existovala aktivní připojení k mé službě, neukončila by se a čekala by, až by se odpojili všichni klienti, až potom by se vypnula. To ale ve velkém množství klientů není možné, jelikož je pravděpodobné, že nějaký klient je stále připojen, takže příkazem Abort vynutím okamžité vypnutí služby a přerušení komunikace s klienty. V tomto případě, pokud by klient neměl ošetřenou výjimku při pádu komunikačního kanálu, padla by i jeho samotná aplikace.

V této chvíli už máme naši Windows Service nastavenou, ale nemůžeme ji spustit přímo. Služba se totiž musí přes instalátor nainstalovat do úložiště v systému, kde jsou i ostatní služby.

Znovu si otevřeme designer třídy Service1.cs v projektu WindowsService_Host, klikneme pravým tlačítkem myši a vybereme položku Add Installer. Přidá se nám instalátor a vygenerují se další třídy a reference. Klikneme na serviceInstaller1 a ujistíme se, že ServiceName je nastaveno na WCFSerialHost a přepneme položku Parent na serviceProcessInstaller1. Zároveň je v nastavení i StartType neboli typ spuštění služby. My jej necháme na manuální spuštění, ale pokud chcete, aby se vám služba spouštěla automaticky při startu systému Windows, přepněte na Automatic. Třetí možnost je Disabled, ale tu nedoporučuji použít, protože vám zamezí službu spustit. Nyní vybereme komponentu serviceProcessInstaller1 a v nastavení změníme vlastnost Account z User na LocalSystem. Celý solution můžeme zbuildovat.

Stále ale ještě nejsme hotovi. Sice máme vytvořený installer služby, ale zatím nemáme vytvořený setup project, díky kterému službu skutečně nainstalujeme. Tak se na to vrhneme. Přidáme si nový projekt. Rozklikneme si záložku Other Project Types a vybereme Setup and Deployment. Použijeme template Setup Project a pojmenujeme si jej WCF Serial Setup. Otevře se nám okno, ve kterém upřesníme instalační soubory. Klikneme pravým tlačítkem myši na Application Folder, Add -> Project Output. Z Primary Output vybereme Project WindowsService_Host a potvrdíme. Automaticky by se měla do instalačního projektu přidat i knihovna s WCF Service Library. Zbývají nám přidat Custom Actions. Klikneme na projekt WCF Service Setup pravým tlačítkem myši, pak View a Custom Actions. V Custom Actions pravým tlačítkem vybereme Add Custom Action, rozklikneme Application Folder a vybereme Primary output. Klikneme pravým tlačítkem myši na projekt WCF Serial Setup a sestavíme projekt (Build). Jsme u konce a služba je připravena k instalaci. Opět pravé tlačítko myši a vybereme Install. Projdeme úspěšně přes instalátor a ujistíme se, že je služba skutečně nainstalována. Spustíme tedy proces Services.msc, který nám otevře program pro správu systémových služeb. Najdeme si námi vytvořenou službu WCFSerialHost, která je momentálně zastavená, a spustíme ji. Služba nám nyní běží a je hostována ve Windows Service.

Pokud ji chceme otestovat, uděláme to stejně, jako v minulém díle. Pustíme si klienta, a ten pokud nás vyzve k zadání čísla a číslo nám vrátí, byli jsme úspěšní.

Zdrojové kódy WCF Service Library hostované ve Windows Service.


Kryštof