Voor een project was het noodzakelijk om in een bepaalde interval een webpagina op te vragen. Aangezien een aantal paramters in de querystring meegegeven moest worden besloot ik om zelf een kleine windows service te maken die dit voor mij kon regelen.
Het viel mij op dat hierover eigenlijk helemaal niet zoveel op internet te vinden was, zeker niet voor VB.NET en wat ik vond was niet compleet. Daarom deze blog. Wie weet heeft iemand er nog wat aan en is het sowieso ook voor mijzelf een geheugensteuntje.
Ik heb sinsds kort de beschikking over VS2010 en het .NET Framework 4.0 en deze oplossing is gebaseerd op dit framework. Dus nu alvast de waarschuwing dat je op de beoogde machine wel het juiste .NET framework installeert anders zal het niet gaan werken. :(
In Visual Studio maak je een nieuw project aan en kies je het Windows Service template. Er wordt automatisch een My Project bestand en een Service1.vb bestand aangemaakt. Hernoem gelijk dit bestand naar de gewenste servicenaam en open het in design-mode en pas ook de naam en de ServiceNaam aan bij de eigenschappen.
Aangezien een service doorgaans iets om de zoveel tijd moet uitvoeren beginnen we met een timer naar het scherm te slepen vanuit de toolbox. Hou hierbij in de gaten dat je niet de 'normale'windows form timer moet hebben maar de Systems.Timer.Timer. Desnoods moet je eerst een referentie hiervoor aanmaken of aan je toolbox toevoegen. Daar waar een windows timer het event Tick() heeft is dit voor de System timer het event Elapsed()
Om het resultaat van je service naar de eventviewer te schrijven moet je in het onStart event van de service eerst zorgen dat er een Evenlog.Source wordt aangemaakt anders kent de eventviewer de entry/source niet en kan je daar niets naar toeschrijven.
MyLog As New EventLog() ' create a new event log Not EventLog.SourceExists("myService") Then
EventLog.CreateEventSource("myService", myServiceLog")
End If
MyLog.WriteEntry("Tekst die je wilt loggen")
Verder moet je in het onStart() event ook nog de timer instellen:
True
Timer1.Interval = Tijd in miliseconden
Timer1.Start()
De rest van je code kan je in het Elapsed() event van de timer wegschrijven. In mijn voorbeeld wil ik in een bepaalde interval een webpagina aanroepen. Dit doe ik met het HttpWebRequest object en de interval staat als parameter in het config bestand van het project.
Het resultaat wordt gelogd als in het config bestand de zelf aangemaakte parameter debugMode op True staat. Denk er aan dat het HttpResponse object gesloten wordt anders loopt de boel na twee loops zo vast als een huis. Zie hieronder de volledige code:
System.Net
Public
Private sUrl As String
Class myService Private bDebug As Boolean Protected Overrides Sub OnStart(ByVal args() As String)' Add code here to start your service. This method should set things
' in motion so your service can do its work.
EventLog.CreateEventSource("myService", "myServiceLog")' Create Log
Dim MyLog As New EventLog() ' create a new event log Try
sUrl =
bDebug =My.Settings.URLMy.Settings.debugMode
If Not EventLog.SourceExists("myService") Then
End If
' Write to the Log
Timer1.Enabled =True
Timer1.Interval = 60000
Timer1.Start()
MyLog.Source ="myService"
MyLog.WriteEntry("Log tekst")
Catch ex As Exception
MyLog.WriteEntry(ex.Message, System.Diagnostics.
EventLogEntryType.Error)
End Try End Sub
Protected Overrides Sub OnStop()' Add code here to perform any tear-down necessary to stop your service.
Timer1.Enabled =False
Timer1.Stop()
End Sub
Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
Dim MyLog As New EventLog() ' create a new event log
'' Check if the the Event Log Exists
MyLog.Source ="myService"
Try
Dim httpRequest As HttpWebRequest
httpRequest =
Dim targetURI As New Uri(sUrl)
Dim httpResponse As HttpWebResponse CType(WebRequest.Create(targetURI.AbsoluteUri), HttpWebRequest)'httpRequest.Timeout = 30000
httpResponse =
CType(httpRequest.GetResponse(), HttpWebResponse)If bDebug = True Then
MyLog.WriteEntry(
sUrl,
CType(httpResponse.StatusCode & vbNewLine & _String))End If
httpResponse.Close()
Catch ex As Exception
'Error in accessing the resource, handle it
' Write to the Log
MyLog.WriteEntry(ex.Message, System.Diagnostics.
EventLogEntryType.Error)End Try
End Sub
End
Class
Imports
Timer1.Enabled =