Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Scrivere un servizio per windows

Il .Net permette di scrivere un servizio di windows con veramente pochissime linee di codice, ma per scrivere un servizio veramente robusto sono necessari alcuni accorgimenti.

Prima di tutto faccio sempre una classe che ha solo due metodi: Start() e Stop(), in modo da poterla utilizzare con il servizio integrato di Spring.Net oppure da un proprio servizio. La cosa più importante è per me il logging, il servizio non è interattivo e non ha quindi un utente che lo utilizza e che rileva le eccezioni che vengono generate. In un normale programma windows infatti al generarsi di un eccezione non gestita il programma si chiude, ma l'utente può riaprirlo subito e soprattutto segnalare questa anomalia al team di sviluppo. Per un servizio questo non è possibile, una eccezione non gestita farà chrashare il servizio stesso che di fatto risulterà stoppato.

Come prima cosa imposto le proprietà del servizio facendo in modo che ai primi tre arresti inattesi il servizio venga comunque fatto ripartire, ma chiaramente è necessario avere un log tempestivo di cosa è andato storto. Utilizzando le API di logging dell'enterprise library è facile inserire un log per le eccezioni e far si che questo log venga segnato sia negli eventi di sistema del pc, sia spedito per mail al team di sviluppo che può cosi essere avvertito immediatamente del verificarsi dell'errore.

Il progetto del servizio è poi un normalissimo programma windows, per cui inserisco un controllo sui parametri di linea di comando e se presente il parametro /GUI, invece di far partire il servizio, faccio partire una form di diagnostica con cui posso chiamare il metodo start del servizio premendo un bottone ed inoltre posso aggiungere vari controlli con funzionalità diagniostica. Uno dei principali problemi è che se il servizio genera un'eccezione praticamente dopo pochi secondi dallo start, è difficile attaccarci un debugger, mentre lanciandolo con il parametro /GUI ho tutto il tempo di attaccare il debugger e poi premere un bottone, inoltre impostando /GUi come parametro dal visual studio posso sviluppare il servizio e lanciarlo come un normale programma windos.

Ah: naturalmente scrivere una gran quantità di unit test, che possano raggiungere il 100% di code coverage assicura che il codice sia ben testato e rende spesso superfluo dovere attaccare un debugger al servizio per capire cosa non va.

Alk.

Print | posted on venerdì 21 settembre 2007 12:26 | Filed Under [ Generale ]

Feedback

Gravatar

# re: Scrivere un servizio per windows

Proprio questa mattina, appena aperto Visual Studio 2005, avevo creato un nuovo progretto per realizzare un Windows Service.

Dopo pochi secondi, è apparso il popup di RSSBandit che mostrava il titolo di questo tuo post... che dire ottimo tempismo. Stavo cercando suggerimenti e consigli sulla rete, e guarda un po', mi sono ritrovato il suggerimento a domicilio.

Grazie. Adesso cerco di seguire i tuoi consigli.
21/09/2007 13:08 | Roberto Corradetti
Gravatar

# re: Scrivere un servizio per windows

se ho tempo faccio anche altri post sempre sui servizi, sono tutte considerazioni semplici ma spesso mi salvano un po di tempo, soprattutto il fatto di tenere il parametro /GUI che mi consente di debuggare il progetto come un normale programma windows, poi spostarlo nel server di produzione e farlo girare come servizio.

Alk.
21/09/2007 13:51 | Gian Maria
Gravatar

# re: Scrivere un servizio per windows

Aggiungo che conviene aggiungere una classe MyServiceInstaller, derivando System.Configuration.Install.Installer, che si preoccupi di installare e rimuovre il servizio in modo corretto.
Trovate un esempio qua: http://msdn2.microsoft.com/en-us/library/system.configuration.install.installer.aspx
21/09/2007 15:05 | Alesssandro Scardova
Gravatar

# re: Scrivere un servizio per windows

Il mio giudizio sulla parte di spring.services è "lascia perdere" :D, scherzi a parte, nel mio blog avevo anche scritto tempo fa come fare a far funzionare il tutto..ma la sostanza è che ti risparmia 20 righe di codice, ma ad esempio io non sono riuscito a far funzionare il log.....quindi magari se hai sbagliato il file di configurazione il servizio parte....il tuo codice non viene chiamato e vai a capire perchè. Consiglio personale, il .NET rende veramente semplice scrivere un servizio, usiamo quello che è meglio :D. In realtà poi la parte di spring.windows.services non è presente nella libreria ufficiale, devi scaricare dal trunk e compilare quello, sinonimo che èuna parte assai poco testata a mio avviso.

Alk.
21/09/2007 19:13 | Gian Maria
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET