Comment faire une action toutes les x heures est une question souvent posé sur le forum.
Voici l'astuce pour arriver à faire executer un bout de code à asp.net de facon regulière automatiquement.
L'astuce consiste simplement à mettre un timer dans l'application_start du global.asax.
Le code ci dessous utilise un thread pour obtenir un code plus efficace et aussi plus "joli"
Ce code est volontairement tres simple, il n'est pas la pour faire des opérations compliqués. Il enregistre toutes les 10sec la date dans un fichier de Log.
Ce qui est important c'est la facon dont le code fonctionne.
Premièrement quand une application web se charge, la procédure Application_Start est déclenché. Celle ci n'est declenché seulement la premiere fois qu'un visiteur ouvre le site, pour qu'elle soit ensuite redemarré il faut que le serveur IIS soit redemarré. Attention si vous tester ce code, pour arreter l'ecriture du log, il faut arreter IIS !!!
Ensuite une fois qu'Application_Start est lancé, on instancie notre classe, on demarre Start dans un autre thread.
Une fois le thread lancé, la procédure start de la classe test est executé, le timer est créer, attention l'interval est en ms !!! Ensuite on associe la fonction EcrireLog a chaque fois que le timer est "Elapsed" puis on lance le timer, et désormais toute les 10 sec le fichier test.log aura une ligne de plus.
Je rappel que pour arreter l'ecriture du fichier log, il faut redemarrer IIS !!!
Cet astuce ne fonctionne pas chez tout les hebergeurs, les hebergeurs mutualisé stop l'application s'il n'y a plus aucun activité dessus, a 10 min par défaut apparemment.
Source / Exemple :
'Fichier global.asax.vb
Imports System.Web
Imports System.Web.SessionState
Imports System.IO
Imports System.Threading
Public Class Global
Inherits System.Web.HttpApplication
Private oThread As Thread
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Se déclenche lorsque l'application est démarrée
'on instancie la classe, donne l'adresse de départ du thread, puis lance le thread
Dim oTest As New Test
oThread = New Thread(AddressOf oTest.Start)
oThread.Start()
End Sub
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' Se déclenche lorsqu'une erreur se produit
oThread.Abort()
End Sub
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
' Se déclenche lorsque l'application se termine
oThread.Abort()
End Sub
End Class
Public Class Test
Private _Fichier As String = "C:\Inetpub\wwwroot\TestVB2003\Test.log"
'Fonction start sans argument pour le thread !
Public Sub Start()
Dim oTimer As New Timers.Timer(10000) 'Attention interval en ms
AddHandler oTimer.Elapsed, AddressOf EcrireLog
oTimer.Start()
End Sub
Public Sub EcrireLog(ByVal s As Object, ByVal e As System.Timers.ElapsedEventArgs)
Dim LogStream As New StreamWriter(_Fichier, True, System.Text.Encoding.UTF8)
Try
LogStream.WriteLine(Now())
LogStream.Close()
Catch
'erreur, impossible d'ecrire dans le fichier
End Try
End Sub
End Class
Conclusion :
Pour pouvoir directement tester le code il suffit de changer l'adresse du fichier d'inclure le code dans le global.asax.vb et bien sur avoir accordé l'autorisation d'ecriture à aspnet.
Ce code risque surement d'évoluer pour avoir un meilleur controle sur le thread (arreté mettre en pause, redemarré etc...) , il vous sera tout de meme utile comme point de départ.
N'hésiter pas à donner vos impressions sur ce code via les commentaires et une petite note fait toujours plaisir.
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.