Business partners:

Aventeon

 

Intermec 

  

Welnet 

 

 Motorola Solutions

 

 Preferred Supplier van:

 Mediq-Logistiek

 

Reseller van:

Logistics.One

 

  SOTI

 

 

 

 

Leerbedrijf

 

Blogs

okt 27

Written by: Gert van Oel
27-10-2010 10:32 

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 A 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 =

Tags:

VOICT B.V. en VOICT Services B.V. - Keesomstraat 31 - 6717AH Ede - T: 0318 642413 - E: info@voict.nl