Creazione di un servizio

giovedì 20 novembre 2008 - 23.07

bluland Profilo | Guru

Salve,

sto progettando un applicazione che fa il parsing di file in xml, li rielabora e li inserisce un db sql 2000
attraverso una serie di transazioni, memorizza eventuali errori di inserimento che poi saranno monitorati
attraverso una pagina web.

mi chiedevo poiche questa applicazione dovra essere a lavoro 24 h su 24, che vantaggi avre se ovviamente
vantaggi ci sono a creare un windows service piuttosto che un applicazione, da premettere che non ho mai
lavorato con i service, però mi hanno posto la domanda!


accetto opinioni e consigli Saluti!


--------------------
Vincenzo PESANTE
Software Engineer

tonyexpo Profilo | Senior Member

Ciao

i Windows Service sono delle applicazioni che possono effettuare compiti "long-running" (H24) molto meglio di un'applicazione windows.
Le differenze principali sono:
1) Non necessitano di login al pc/server
2) Possono girare con un'utenza ad hoc (di solito di servizio)
3) Sono gestibili da apposito pannello con possibilità di impostare tipo di avvio e quant'altro. Interessante è la possibilità di avviare il servizio in automatico anche dopo un eventuale crash del sistema o dell'applicazione.

Ovviamente lo sviluppo deve tenere presente la diversa architettura, ma nel tuo caso la preferirei molto ad altre possibiltà (win), escluso ovviamente altre tecnologie service-oriented.

Se vuoi approfondire, chiedi pure
Antonio Esposito
MCP, MCTS .NET 2.0 Distributed applications

bluland Profilo | Guru

Beh ripeto non ho mai creato win services,
ho visto l'esempio che c'è su questo sito, sembre uguale alle win app,
dovrei solo inserire il codice di load nell'evento onstart,
poi la connessione sql rimarrebbe tutto uguale giusto?

ciao
--------------------
Vincenzo PESANTE
Software Engineer

R3GM4ST3R Profilo | Junior Member

Ciao, tieni presente che il windows service ha solo 2 eventi, ONSTART e ONSTOP, non ha interfaccia grafica, quindi ti consiglio vivamente di usare Eventlog, e quindi di crearti un nuovo registro eventi per il tuo servizio (in modo che non vada ad "imputtanarti" gli altri registri base di sistema)
Altra dritta, tieni presente che i servizi generalmente partono con l'account local system, quindi se ti interfacci ad un database ricordati di aggiungere l'utente corretto al database...mmm poi vediamo che altro...ah per effettuare il debug di un windows service ricordati di modificare la classe principale di avvio
Esempio c#

#if (!DEBUG)
// Sono in esecuzione normale
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() };
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
#else
// Sono in debug-mode
Service1 service = new Service1();
service.Start(); //Start è la funzione principale di avvio
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#endif

Ciaux

bluland Profilo | Guru

Ciao hai qualche esempio da sottopormi?

saluti
--------------------
Vincenzo PESANTE
Software Engineer

R3GM4ST3R Profilo | Junior Member

Ciao Vincenzo,
ecco un esempio in vb.net di un windows service
spero di averlo commentato in modo decente
se hai domande fai pure
ciauz
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)

bluland Profilo | Guru

CIao io uso vs.2003, cmq mi studiero' il tuo esempio, probabilmente posso usare quei metodi anche col frmk 1.1,

>Ciao, tieni presente che il windows service ha solo 2 eventi,
>ONSTART e ONSTOP, non ha interfaccia grafica, quindi ti consiglio
>vivamente di usare Eventlog, e quindi di crearti un nuovo registro
>eventi per il tuo servizio (in modo che non vada ad "imputtanarti"
>gli altri registri base di sistema)

mi devo studiare un po' gli Eventlog, poiche io avevo previsto cmq di importare quasiasi tipo di errore in un file xml,
che poi avrei dovuto leggere attraverso una web application.

>Altra dritta, tieni presente che i servizi generalmente partono
>con l'account local system, quindi se ti interfacci ad un database
>ricordati di aggiungere l'utente corretto al database...mmm poi

poiche devo collegarmi ad un db SQL srv 2000 usero' una connessione sql connection, questo dovrebbe esonerarmi dal problema giusto?

>vediamo che altro...ah per effettuare il debug di un windows
>service ricordati di modificare la classe principale di avvio
>Esempio c#>
ho visto nell' esempio ad un certo punto suggerisci di usare un timer, poiche devo ciclare 24h su 24 delle cartelle potrei usare anche un ciclo for infinito?

Per l'installazione non si potrebbe fare un pacchetto?

saluti e grazie

--------------------
Vincenzo PESANTE
Software Engineer

R3GM4ST3R Profilo | Junior Member

Ciao Vincenzo,
dunque :

>mi devo studiare un po' gli Eventlog, poiche io avevo previsto cmq di importare quasiasi tipo di errore in un file xml,
>che poi avrei dovuto leggere attraverso una web application.

Gli errori di parsing dei file xml è meglio che te li salvi in una tabella del database, in modo che poi tramite una banale pagina aspx te li tiri su con una query e bona...

>poiche devo collegarmi ad un db SQL srv 2000 usero' una connessione sql connection, questo dovrebbe esonerarmi dal problema giusto?

Giusto, se l'istanza di sqlserver risiede nella stessa macchina dove girerà il servizio non hai di che preoccuparti. (almeno in teoria :D)

>ho visto nell' esempio ad un certo punto suggerisci di usare un timer, poiche devo ciclare 24h su 24 delle cartelle potrei usare anche un ciclo for infinito?

beh diciamo che un ciclo for o while infinito bloccano l'elaborazione degli altri eventi che potrebbero scatenarsi durante l'esecuzione del servizio e potrebbero portare all'instabilità del servizio stesso, quindi ti consiglierei di usare il timer.

Ricapitolando, se non ho capito male, devi controllare su un server remoto se è presente un file xml, in caso affermativo devi elaborarlo...
io userei un timer appunto per controllare tramite l'oggetto "HttpRequest" se nel server remoto esiste un file xml da elaborare;
in caso affermativo tramite l'oggetto "HttpResponse" o addirittura lo stesso "HttpRequest" (non ricordo bene) ti fai il download in locale del file xml da elaborare, successivamente in un bel thread separato fai fare al servizio il parsing del file appena scaricato salvandoti le informazioni che ti servono...

E' più difficile a dirsi che a farsi

Saluti!
Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)

bluland Profilo | Guru

>Ciao Vincenzo,
>dunque :
>
>>mi devo studiare un po' gli Eventlog, poiche io avevo previsto cmq di importare quasiasi tipo di errore in un file xml,
>>che poi avrei dovuto leggere attraverso una web application.
>
>Gli errori di parsing dei file xml è meglio che te li salvi in
>una tabella del database, in modo che poi tramite una banale
>pagina aspx te li tiri su con una query e bona...
>
in realta avevo pensato di inserire una parte di errori nel db mentre un altra nel file xml.
poiche il db risiede su una macchina diversa, ad esempio un errore di connessione persa lo metto nel
file xml.
>>poiche devo collegarmi ad un db SQL srv 2000 usero' una connessione sql connection, questo dovrebbe >esonerarmi dal problema giusto?
>Giusto, se l'istanza di sqlserver risiede nella stessa macchina
>dove girerà il servizio non hai di che preoccuparti. (almeno
>in teoria :D)
>

non risiede nella stessa macchina,ma cmq sono nello stesso dominio, credo che cmq basti usare
un user valido per il db, allo stesso modo come faccio per web application!!?!?


>>ho visto nell' esempio ad un certo punto suggerisci di usare un timer, poiche devo ciclare 24h su 24 delle cartelle potrei usare anche un ciclo for infinito?
>
>beh diciamo che un ciclo for o while infinito bloccano l'elaborazione
>degli altri eventi che potrebbero scatenarsi durante l'esecuzione
>del servizio e potrebbero portare all'instabilità del servizio
>stesso, quindi ti consiglierei di usare il timer.
>
>Ricapitolando, se non ho capito male, devi controllare su un
>server remoto se è presente un file xml, in caso affermativo
>devi elaborarlo...
>io userei un timer appunto per controllare tramite l'oggetto
>"HttpRequest" se nel server remoto esiste un file xml da elaborare;
>in caso affermativo tramite l'oggetto "HttpResponse" o addirittura
>lo stesso "HttpRequest" (non ricordo bene) ti fai il download
>in locale del file xml da elaborare, successivamente in un bel
>thread separato fai fare al servizio il parsing del file appena
>scaricato salvandoti le informazioni che ti servono...
>

si allora ci saranno 4 cartelle che saranno riempite da un altra applicazione (che inserirà qualche migliaio di files xml al giorno), esse risiedono sulla stessa macchina dove girerà il servizio, le dovrò ciclare H24, aprire i file uno per volta elaborarlo ed inserire i dati in un db, inoltre il servizio se incontra una qualsiasi eccezione nell'elaborare un file non si deve mai fermare, magari mettere il file in un area di attesa e registra nel db l'errore, nel momento che viene risolto ripesca i files.


saluti

>E' più difficile a dirsi che a farsi
>
>Saluti!
> Tutti sanno che una cosa è impossibile da realizzare, finché
>arriva uno sprovveduto che non lo sa e la inventa. (Albert Einstein)
>

--------------------
Vincenzo PESANTE
Software Engineer
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5