Programování služeb ve Windows - 5.díl
Upravujeme Class - Service1 : ServiceBase
Upravíme kód pro připojení k serveru:
public partial class Service1 : ServiceBase { private const string SERVICENAME = "MojeService1"; //1 private Server1 server1 = null; public Service1() { InitializeComponent(); this.ServiceName = SERVICENAME; this.CanPauseAndContinue = true; //2 this.CanHandlePowerEvent = false; //3 this.OnPowerEvent(PowerBroadcastStatus.BatteryLow); //4 this.CanStop = true; //5 this.AutoLog = true; //6 } protected override void OnStart(@"C:\Temp\quotes.txt", 5678) { server1 = new Server1(); //reference na náš server server1.Start(args); } protected override void OnStop() { server1.Stop(); } protected override void OnPause() { server1.Suspend(); } protected override void OnContinue() { server1.Resume(); } protected override void OnShutdown() { OnStop(); } public const int commandRefresh = 128; //7 protected override void OnCustomCommand(int command) { switch (command) { case commandRefresh: server1.RefreshQuotes(); break; default: break; } } }
- jméno musí být stejné jako ve třídě Installer
- zpřístupní Pause a Continue
- získá nebo nastaví hodnotu označující zda může služba zpracovat oznámení změny stavu napájení počítače
- označuje stav napájení systému
- získá nebo nastaví hodnotu označující zda lze službu zastavit jakmile byla zahájena
- označuje, zda zprávu příkazy spustit, zastavit, pozastavit a pokračovat v protokolu událostí EventLog.Source
- slouží ke spouštění vlastních příkazů, které jsou službě posílány programem řízení služby. Struktura metody OnCustomCommand(int i) obsahuje argument typu int, ve kterém je číslo vlastního příkazu. Hodnota tohoto čísla leží v rozsahu 128 až 256, nižší hodnoty jsou rezervovány pro systém.
- načítá vlastní příkaz v tomto případě soubor. Tento příkaz se provede vždy jako první příkaz po spuštění služby. Soubor musí mít zapsán celý path a nesmí obsahovat dvojitá lomítka! Pokud nespouštím vlastní příkazy, je položka 7 a 8 vynechána. Soubor v tomto případě musí existovat tak i nějaký obsah musí mít. Je přiložen ukázkový soubor. Můžeme používat cokoliv, nemusí to být soubor.
class Server1 : Component - úprava komponenty
Pokud nebudete používat čítače výkonu a pokud nejsou registrovány, musíme odebrat odkazy na performanceCounter. Chybí kolekce v čítačích výkonu a server by nešel spustit.
Architektura protokolování událostí - komponenta EventLog
Architektura protokolování:
- soubor aplikace
- soubor zabezpečení
- soubor systém
Události v protokolu událostí:
- Typ (Informace, Upozornění, Chyba)
- Datum a čas
- Zdroj události (software, který událost vyvolal)
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\EventLog\Application\(název aplikace).
- V tomto klíči je též hodnota EventMessageFile, která ukazuje na dynamickou knihovnu zdrojů s chybovými zprávami.
- Kategorie (dávají možnost filtrovat události)
Třídy protokolování událostí (System.Diagnostics)
- EventLog - číst a zapisovat záznamy v protokolu
- EventLogEntry zastupuje záznam v protokolu událostí
- EventLogEntryCollection procházíme položky v EventLogEntry
- EventLogInstaller slouží jako instalátor EventLog. Volá pro vytvoření zdroje událostní metodu EventLog.CreateEventSource.
- EventLogTraceListener ukládáme do protokolu událostí záznamy trastování. Implementuje abstraktní třídu TraceListener.
Jak přidáváme protokolování událostí
Třída ServiceBase, vlastnost AutoLog = true, pak je protokolování automaticky zapnuto. Vytvoří se třída EventLogInstaller pro konfiguraci zdroje a protokoluje (start, Stop, Pozastavit a pokračovat). Události se zapisují metodou WriteEntry() třídy EventLog. EventLogl.WriteEntry("Toto je zpráva protokolu událostí"). Upozornění a chyby se řeší přetížením metody WriteEvent():
EventLogl.WriteEntry("Toto je zpráva protokolu událostí",EventLogEntryType.Warning); EventLogl.WriteEntry("Toto je zpráva protokolu událostí",EventLogEntryType.Error);
Problém security - Nemáme oprávnění
Pokud nejsme přihlášeni jako "administrátor", můžeme obdržet tuto chybovou hlášku. V souboru cmd.exe nemáme označené políčko Spustit jako správce.


Registr
Pokud je naše služba správně nainstalována, je zapsána v registru v
klíči:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\(název
aplikace)]

Co dělat při uvedené chybě?

Tato chyba vznikne po hrubé chybě v programu, je nutné pokusit se odinstalovat službu třeba i několikrát, vymazat v registru klíč MojeService1, restartovat počítač. Nesnažte se cokoliv dopisovat do klíče "Service", poškodíte databázi služeb (chyba 7005) a toto nelze odstranit, doporučují přeinstalovat Windows. Pokud je služba spuštěna, nepokoušejte se ji odinstalovat!
Závěr
Je třeba si uvědomit, že tyto díly tutoriálu jsou pouze základem tvorby služeb ve Windows. Doufám, že se mi to aspoň trochu povedlo nastínit. Snad tento tutoriál rozšíří vaše vědomosti a posune vás o kousek dál. Zdrojové kódy je možno bez problému zkompilovat ve VS 2013. Pokud chcete spustit aplikaci ve 2013 a máte vytvořenou aplikaci ve 2010, pak přejmenujte vaši službu, uděláte si zbytečně chyby v registru, velmi těžce se odstraňují.
Ve složce jsou Pojmenované kanály a Asynchronní kanály, ukázka přenosu dat mimo protokol IP. Jsou nakopírovány do formuláře tříd pro přehlednost. O této problematice snad někdy jindy.
Dokument Chyby a odkazy ukazuje na řešení některých problémů. Soubor quotest.txt je pomocný dokument pro testování.
Zde ještě nejásejte, pokud máte službu odladěnou, je třeba ji nainstalovat do složky "Windows/system32/" pomocí instalačního programu.
Tato služba byla postavena na bázi IP. V dalším díle je funkční ukázka Klient - Server přenos pomocí Rour (Pipes). Server je vytvořen jako pojmenovaná roura pomocí překrývajícího I/O . Jedná se o jednovláknový server, který využívá překrývající se operace pro připojení více klientů. Je napsán v C++. Ukázka se dá celkem snadno upravit pro .NET bez použití Plnvoke .
Na závěr bych chtěl poděkovat Davidu Čápkovi za pomoc při korekci a úpravě těchto článků.
Děkuji za trpělivost a hezkou četbu.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 90x (358.36 kB)
Aplikace je včetně zdrojových kódů v jazyce C#