Problèmes de création d'un service Windows [Résolu]

nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 11:23 - Dernière réponse : nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention
- 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.


}


}


}
Afficher la suite 

23 réponses

Répondre au sujet
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 28 nov. 2005 à 12:42
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de TheSaib
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 12:18
0
Utile
So the problem is ?
Commenter la réponse de TheSaib
nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 12:22
0
Utile
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 ...
Commenter la réponse de nyoto
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 12:26
0
Utile
Un exception dans les logs ?
Commenter la réponse de TheSaib
nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 12:30
0
Utile
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 !!!
Commenter la réponse de nyoto
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 12:38
0
Utile
Etre Newbie n'est pas une excuse.

Quelle ligne ?
Commenter la réponse de TheSaib
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 12:44
0
Utile
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.
Commenter la réponse de TheSaib
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 12:47
0
Utile
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
Commenter la réponse de TheSaib
nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 13:03
0
Utile
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 !!!
Commenter la réponse de nyoto
nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 14:55
0
Utile
Flutte ...
Ben j'ai exactement la même erreur avec un compte admin et idem en tentant mon écriture en local ...
Commenter la réponse de nyoto
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 15:22
0
Utile
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
Commenter la réponse de TheSaib
nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 15:33
0
Utile
Euh ... j'ai pas capté le fonctionnement du lock (this) ...
Commenter la réponse de nyoto
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 15:41
0
Utile
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;
.....

}
}
Commenter la réponse de TheSaib
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 15:43
0
Utile
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.
}
Commenter la réponse de TheSaib
crougni 18 Messages postés mardi 20 septembre 2005Date d'inscription 3 mars 2009 Dernière intervention - 25 nov. 2005 à 15:58
0
Utile
Salut



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



CrougniMan
Commenter la réponse de crougni
nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 16:15
0
Utile
Euh ... t'arrives à le faire tourner toi ???
Commenter la réponse de nyoto
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 16:53
0
Utile
Oui çà tourne.
Commenter la réponse de TheSaib
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 16:56
0
Utile
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.
Commenter la réponse de TheSaib
nyoto 47 Messages postés mercredi 3 novembre 2004Date d'inscription 2 mai 2006 Dernière intervention - 25 nov. 2005 à 17:18
0
Utile
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 !!!
Commenter la réponse de nyoto
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 25 nov. 2005 à 17:25
0
Utile
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 ?
Commenter la réponse de TheSaib

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

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