Programování služeb ve Windows - 5.díl

C# .NET Pro pokročilé 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;
        }
    }
}
  1. jméno musí být stejné jako ve třídě Installer
  2. zpřístupní Pause a Continue
  3. získá nebo nastaví hodnotu označující zda může služba zpracovat oznámení změny stavu napájení počítače
  4. označuje stav napájení systému
  5. získá nebo nastaví hodnotu označující zda lze službu zastavit jakmile byla zahájena
  6. označuje, zda zprávu příkazy spustit, zastavit, pozastavit a pokračovat v protokolu událostí EventLog.Source
  7. slouží ke spouštění vlastních příkazů, které jsou službě posílány programem řízení služby. Struktura metody OnCustomComman­d(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.
  8. 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 performanceCou­nter. 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_MAC­HINE\System\Cu­rrentControlSet\Ser­vices\EventLog\Ap­plication\(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.Diagnos­tics)

  • EventLog - číst a zapisovat záznamy v protokolu
  • EventLogEntry zastupuje záznam v protokolu událostí
  • EventLogEntry­Collection procházíme položky v EventLogEntry
  • EventLogInstaller slouží jako instalátor EventLog. Volá pro vytvoření zdroje událostní metodu EventLog.Crea­teEventSource.
  • EventLogTrace­Listener 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.Wri­teEntry("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.

Error Security

Registr

Pokud je naše služba správně nainstalována, je zapsána v registru v klíči:
[HKEY_LOCAL_MAC­HINE\SYSTEM\Cu­rrentControlSet\ser­vices\(název aplikace)]

Registr slervice

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

Vážná chyba

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ženo 57x (358.36 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal zpavlu
Avatar
C# a C++

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
C# - Pro pokročilé

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!