Creazione e installazione di un Windows Service

di Cristiano Degiorgis, in .NET Framework,
  • 0
  • 0
  • 0
  • 444,73 KB

Un Windows Service (in italiano detto anche Servizio) altro non è che un programma che gira in background all'interno di Windows. Una volta installato come servizio, il programma può essere gestito da uno snap-in disponibile nel MMC di gestione del sistema sotto "Services and Applications/Service" che permette di impostare la modalità con cui il servizio parte, l'account con cui questo programma gira, i parametri che possono essere passati in fase di lancio, le operazioni da compiere nel caso in cui il lancio del programma non vada a buon fine, ecc.

I servizi in genere rappresentano un valido e solido sistema per effettuare operazioni asincrone che possono servire in qualsiasi tipo di applicazione. Delegare ad un servizio tutte quelle operazioni di manutenzione (pulizia di un database, eliminazione di file, ecc.) che un'applicazione può richiedere è sicuramente una valida scelta per garantire solidità a tali operazioni e per non gravare l'applicazione di operazioni che possono essere eseguite da altri processi.

Un altro ambito in cui i servizi diventano utilissimi è dato dalla gestione delle code. In particolare in uno scenario web, dove la rapidità di risposta è essenziale al successo di un'applicazione, utilizzare un servizio per eseguire operazioni accodate dalle esigenze dell'applicazione è un'ottimo sistema per garantire uno smaltimento rapido e sicuro della coda, a prescindere dai possibili crash o recycling che la nostra applicazione può avere.

In definitiva gli strumenti offerti dal .NET Framework e, in particolare, da ASP.NET sono così ampi e completi da permettere allo sviluppatore di scegliere di effettuare direttamente nelle applicazioni molte delle operazioni che possono essere delegate ad un servizio (operazioni asincrone, timer, impersonificazione, ecc.). In molti casi peraltro i servizi garantiscono una maggiore solidità, migliorando le performance e il controllo sulle operazioni asincrone, e questo rappresenta un valido motivo per preferirli come soluzione di sviluppo.

Lo scenario

Per questo articolo immaginiamo il seguente scenario: attraverso una nostra applicazione vogliamo inserire in una coda, nel nostro caso un file XML, indirizzi email che devono essere periodicamente smistati. Nel nostro caso, a puro scopo didattico, gli indirizzi devono essere semplicemente spostati su un'altro file. Scegliamo di delegare le operazioni di elaborazione della coda ad un servizio. La nostra applicazione ci deve permettere quindi di accodare gli indirizzi email e di monitorare il loro smistamento senza eseguire alcun tipo di elaborazione sulla coda.

Creazione del servizio

Visual Studio 2005 prevede un template di progetto per creare un Windows Service. Creata la soluzione e aggiunto il Web Site che rappresenta la nostra applicazione web, andiamo ad aggiungere un progetto per la creazione del servizio. Agendo sul menù di Visual Studio, la sequenza File -> New -> Project apre una finestra in cui andiamo a selezionare il progetto per la creazione del servizio.

3Figura 1

Tra i file aggiunti dal template del progetto troviamo Service1.cs, in cui dovrà essere incluso il codice utile ad effettuare le operazioni richieste al nostro servizio, e Program.cs che conterrà il metodo Main che rappresenta l'entry-point del nostro programma. Come detto nell'introduzione dell'articolo, un servizio altro non è che un tipo particolare di applicazione, quindi possiamo gestire i file e i namespace come siamo abituati, prestando attenzione solo ad alcuni accorgimenti che ora andremo a vedere. I nomi dei file riportati poc'anzi sono quelli creati di default da Visual Studio, ma è consigliabile rinominarli utilizzando un nome appropriato. In questo esempio rinominiamo Service1.cs in WpWindowsServiceTutorial.cs.

La classe che rappresenta il nostro servizio è un componente che eredita da System.ServiceProcess.ServiceBase e deve quindi implementare i metodi OnStart e OnStop che sono rispettivamente richiamati all'avvio e al termine dell'esecuzione del servizio. Di seguito riportiamo la struttura iniziale della classe prima dell'implementazione vera e propria dei metodi OnStart e OnStop:

namespace It.WebProfessor.AspItalia.Articles
{
  public partial class WpWindowsServiceTutorial : ServiceBase
  {
    public WpWindowsServiceTutorial()
    {
      // Costruttore.
    }

    protected override void OnStart(string[] args)
    {
      // Codice eseguito all'avvio del servizio.
    }

    protected override void OnStop()
    {
      // Codice eseguito al termine del servizio.
    }
  }
}

Il secondo passo da eseguire è dato dall'aggiunta di un Installer sul quale si basa l'installazione del servizio nel sistema una volta che è completato. Per aggiungere l'installer visualizziamo in modalità designer il file che contiene la classe realtiva al servizio (WpWindowsServiceTutorial.cs); cliccando col tasto destro del mouse, selezioniamo dal menù contestuale la voce Add Installer (vedi figura). Automaticamente Visual Studio genera dietro le quinte il codice necessario per la definizione di un componente che deriva dalla classe base System.Configuration.Install.Installer.

Figura 2

Aprendo in modalità designer l'installer troviamo due oggetti che sono membri della classe installer generata: serviceProcessInstaller1 e serviceInstaller1. Questi due oggetti vengono chiamati dall'utility di installazione (come per esempio InstallUtil.exe) nel momento in cui il servizio viene effettivamente installato sul sistema. Nel caso in cui abbiamo più servizi da installare, possiamo utilizzare lo stesso installer trascinando gli oggetti dalla ToolBook dentro il designer dell'installer per includerli nel processo di installazione.

Nell'ambito dell'installer è possibile indicare alcuni parametri utili all'installazione del servizio. Considerando il box Properties di serviceProcessInstaller1, attraverso la proprietà Account, possiamo indicare l'utente con cui viene lanciato il servizio; per comodità scegliamo LocalSystem. Tra le varie opzioni è peraltro possibile indicare un account utente per il quale è necessario fornire le credenziali di accesso (Username e Password) o in fase di installazione o in via programmatica nell'inizializzazione del componente di installazione.

Figura 3

2 pagine in totale: 1 2

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti