Problèmes de création d'un service Windows

Résolu
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006 - 25 nov. 2005 à 11:23
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006 - 28 nov. 2005 à 13:07
Bonjour à tous,

Ne développant pas depuis très longtemps en .Net je galère grave pour créer un service windows récupérant automatiquement à intervalles de temps données des images situées sur le web.

Voilà ci-dessous mon code source, il est important de noter que j'avais à la base codé une application windows et que cette récupération fonctionnait correctement ...

Merci d'avance ...


using System;


using System.Collections;


using System.ComponentModel;


using System.Data;


using System.Diagnostics;


using System.ServiceProcess;


using System.Net;


using System.Timers;


using System.Threading;


using System.Xml;


using System.Configuration.Install;


using System.Web.Mail;


namespace ServiceFStatsTNT


{



// Cette classe permet de pouvoir compiler le service afin d'en obtenir un executable binaire



// Cependant, ce n'est pas suffisant pour installer le service windows. Ceci permet juste d'avoir un .exe



// Il faudra une etape supplementaire pour installer le service sur votre machine


[RunInstaller(
true)]



public
class MyProjectInstaller: Installer


{



public MyProjectInstaller() :
base()


{



this.Committed +=
new InstallEventHandler(MyProjectInstaller_Committed);



this.Committing +=
new InstallEventHandler(MyProjectInstaller_Committing);



//Instantie les installeurs


ServiceInstaller monServiceInstaller =
new ServiceInstaller();


ServiceProcessInstaller monProcessInstaller =
new ServiceProcessInstaller();



// Le nom du service doit etre egal au nom de la classe ServiceBase dont on derive



//(voir le Public Sub New() de la classe MonService pour comprendre)


monServiceInstaller.ServiceName = "ServiceFStatsTNT";


monServiceInstaller.DisplayName = "ServiceFStatsTNT";



// Ajouter les installeurs à la collection (l'ordre n'est pas important)



this.Installers.Add(monServiceInstaller);



// Le service sera lancé sous le compte Systeme


monProcessInstaller.Account = System.ServiceProcess.ServiceAccount.LocalSystem;



// Ajouter les installeurs à la collection (l'ordre n'est pas important)



this.Installers.Add(monProcessInstaller);


}



private
void MyProjectInstaller_Committing(
object sender, InstallEventArgs e)


{


Console.WriteLine("");


Console.WriteLine("Committing Event occured.");


Console.WriteLine("");


}



private
void MyProjectInstaller_Committed(
object sender, InstallEventArgs e)


{


Console.WriteLine("");


Console.WriteLine("Committed Event occured.");


Console.WriteLine("");


}



public
override
void Install(IDictionary savedState)


{



base.Install(savedState);


}



public
override
void Commit(IDictionary savedState)


{



base.Commit(savedState);


}



public
override
void Rollback(IDictionary savedState)


{



base.Rollback(savedState);


}


}



public
class Service1 : System.ServiceProcess.ServiceBase


{



/// <summary>



/// Variable nécessaire au concepteur.



/// </summary>



private System.ComponentModel.Container components =
null;



public Service1()


{



// Cet appel est requis par le Concepteur de composants Windows.Forms.


InitializeComponent();



// TODO : ajoutez les initialisations après l'appel à InitComponent


ServiceName = "ServiceFStatsTNT";


}



// Le point d'entrée principal pour le processus



static
void Main()


{


System.ServiceProcess.ServiceBase[] ServicesToRun;



// Plusieurs services utilisateurs peuvent s'exécuter dans le même processus. Pour ajouter



// un autre service à ce processus, modifiez la ligne suivante



// afin de créer un second objet service. Par exemple,



//



// ServicesToRun = New System.ServiceProcess.ServiceBase[] {new Service1(), new MySecondUserService()};



//


ServicesToRun =
new System.ServiceProcess.ServiceBase[] {
new Service1() };


System.ServiceProcess.ServiceBase.Run(ServicesToRun);


}



/// <summary>



/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas



/// le contenu de cette méthode avec l'éditeur de code.



/// </summary>



private
void InitializeComponent()


{


components =
new System.ComponentModel.Container();



this.ServiceName = "ServiceFBoxStatsTNT";


}



/// <summary>



/// Nettoyage des ressources utilisées.



/// </summary>



protected
override
void Dispose(
bool disposing )


{



if( disposing )


{



if (components !=
null)


{


components.Dispose();


}


}



base.Dispose( disposing );


}



/// <summary>



/// Démarrage du service.



/// </summary>



protected
override
void OnStart(
string[] args)


{



try


{



// Lancement d'un thread qui se chargera du téléchargement


Thread th =
new Thread(
new ThreadStart(StartBoucle));


th.Start();


}



catch (Exception ex)


{



//ecrire l'erreur dans l'event log de la machine


EventLog.WriteEntry("ServiceFBoxStatsTNT", ex.Message, EventLogEntryType.Error, 15);


}


}



public
void StartBoucle()


{


System.Timers.Timer aTimer =
new System.Timers.Timer();


aTimer.Elapsed+=
new ElapsedEventHandler(StartDownload);



// Définition de l'intervalle du Timer (toute les 60 minutes) 3600000


aTimer.Interval=6000;


aTimer.Enabled=
true;


}



public
void StartDownload(
object source, ElapsedEventArgs e2)


{



try


{



// Création d'un objet WebClient (c'est lui qui permet de télécharger un fichier)


WebClient wc =
new WebClient();



string dateactu = DateTime.Now.ToString("dd-MM-yy_HH-mm-ss");



string[] chaine = {"NRJ_12", "W9", "MTV_France", "Europe_2_TV", "Gulli", "NT1"};



//string chemin = "images/NRJ12_" + dateactu + ".jpg";



string laDate = DateTime.Now.ToString("dd/MM/yyyy");



string lHeure = DateTime.Now.ToString("HH:mm:ss");



int vari;



string cheminITV = "P:\\majvirus\\testTonio\\I-TV_" + dateactu + ".jpg";


wc.DownloadFile(@"http://audience.free.fr/graphs/i>TELE-part-3600.gif", @cheminITV);



for (vari=0; vari<=5; vari++)


{



string chemin = "P:\\majvirus\\testTonio\" + chaine[vari] + "_" + dateactu + ".jpg";



// Lancement du téléchargement



// argument 1 : url du fichier source



// argument 2 : l'emplacement ou enregistrer le fichier sur le disque dur


wc.DownloadFile(@"http://audience.free.fr/graphs/" + chaine[vari] + "-part-3600.gif", @chemin);


}



// Destruction de l'objet WebClient


wc.Dispose();



// Et un petit message pour dire que le téléchargement est terminé



//MessageBox.Show("Le téléchargement est terminé", "info", MessageBoxButtons.OK, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);


}



catch(Exception e)


{


EventLog.WriteEntry("FBoxStatsTNT", e.Message, EventLogEntryType.Error, 15);


}


}



/// <summary>



/// Arrêt du service.



/// </summary>



protected
override
void OnStop()


{



// TODO : ajoutez ici le code pour effectuer les destructions nécessaires à l'arrêt de votre service.


}


}


}

23 réponses

TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
28 nov. 2005 à 12:42
Salut,

Le mapping ne fonctionne pas, donc il faut y mettre le lien complet vers la machine .

Pour explication si le mapping ne fonctionne pas c'est parceque les map sont liés à une session (utilisateur), alors que le service fonctionne indépendamment d'une session utilisateur.

Et verifie que l'arborescence de tes répertoires existent bien. Si un répertoire n'existe pas essaye de le créer.
3
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 12:18
So the problem is ?
0
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006
25 nov. 2005 à 12:22
Oui ok j'ai pa exactement tout dit ...
Il semblerait après mise en place et lancement du service que clui-ci tente de faire son job mais il bloque lors de l'écriture de la première image et si on regarde l'emplacement de destination, un fichier image est bien créé mais il est vide et les autres images ne sont pas traités ...
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 12:26
Un exception dans les logs ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006
25 nov. 2005 à 12:30
Oui ... Une exception s'est produite lors d'une demande Webclient (ça je m'en doutais ...) mais pas plus d'infos hélas ...
Je nage grave et je bloque dessus depuis hier ... puis je ne suis qu'un newb !!!
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 12:38
Etre Newbie n'est pas une excuse.

Quelle ligne ?
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 12:44
JE pense que le problème vient du fait que le service tourne avec l'utilisateur "Local System" qui n'a pas les droits d'acceder au réseau et par conséquence de telecharger le fichier sur le net.
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 12:47
Une fois ton service installée change le compte qui le lance et çà devrait marcher.

Par ailleur je en sais pas pourquoi tu met tes noms de ficheir en dur sachant que la page de free peut te fournir un XML.

http://audience.free.fr/audience15.xml
0
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006
25 nov. 2005 à 13:03
Ben paske j'my connais pas encore en XML ... mais effectivement c'est une façon différente d'aborder le prob !!!
Je déj, je teste ta soluce et j'te tiens au courant ...
En tout cas merci du coup de main !!!
0
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006
25 nov. 2005 à 14:55
Flutte ...
Ben j'ai exactement la même erreur avec un compte admin et idem en tentant mon écriture en local ...
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 15:22
J'ai testé et j'ai vu :

1.Le problème vient du fait que tu appelles trop souvent ta fonction startdownload du coup tu as un problème d'accès au fichier.

dans startDownload fait un lock(this){tontraitement}

2. Local System ne peux pas telecharger, crée un user ou change.

3. Ca marche
0
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006
25 nov. 2005 à 15:33
Euh ... j'ai pas capté le fonctionnement du lock (this) ...
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 15:41
Le lock va permettre l'accès au bloc de code sous jacent qu'a un seul et unique thread. Si ton timer veut rentrer dans le code sous jacent alors que le tick precedent n'est pas fini, il sera refoulé. Du coup tu n'aura pas d'erreur du genre "un processus accède déjà à la ressources" (en l'occurence ton image).

lock(this)
{
// CréatiBon d'un objet WebClient (c'est lui qui permet de télécharger un fichier)

WebClient wc = new WebClient();
string dateactu = DateTime.Now.ToString("dd-MM-yy_HH-mm-ss");
string[] chaine = {"NRJ_12", "W9", "MTV_France", "Europe_2_TV", "Gulli", "NT1"};
//string chemin = "images/NRJ12_" + dateactu + ".jpg";
string laDate = DateTime.Now.ToString("dd/MM/yyyy");
string lHeure = DateTime.Now.ToString("HH:mm:ss");
int vari;
.....

}
}
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 15:43
Après il y a un paquet d'optimisation a faire sur ton code.

Du genre ton WebClient wc = new Webclient()

tu le remplaces par :

using (WebClient ws = new Webclient())
{
//Ton code
// Pas besoin du dispose.
}
0
crougni Messages postés 18 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 3 mars 2009
25 nov. 2005 à 15:58
Salut



ton Interval à 6000 me parait un peu trop rapide, Free semble ne mettre à jour leur données que tout les minutes...



CrougniMan
0
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006
25 nov. 2005 à 16:15
Euh ... t'arrives à le faire tourner toi ???
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 16:53
Oui çà tourne.
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 16:56
Si tu veux debugger ton service, va dans ou outil, debugger les processus et cherche ton service. Il s'arretera à tes Breakpoints et tu pourra comprendre tes erreurs.
0
nyoto Messages postés 47 Date d'inscription mercredi 3 novembre 2004 Statut Membre Dernière intervention 2 mai 2006
25 nov. 2005 à 17:18
Impossible de faire tourner ça dans mon réseau ... en local j'ai la même , un fichier commence a être écrit puis il pèse 0 Ko !!!
Ok je crois que j'vai rentrer me reposer à la maison là .. j'en peux plus !!!
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
25 nov. 2005 à 17:25
En débuggant comme je te l'ai dit tu peux voir les exceptions. C'est facile de débugguer. Il m'a fallu 3 minutes pour trouver le problème.

Tu as bien changer les droits de lancement sur le service ??? Tu as fait comment ?
0
Rejoignez-nous