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.
}
}
}