VB.net threading og webserver - hvad gør jeg forkert?
Jeg forsøger at oprette en webserver i VB.net, der lytter efter POST's og svarer tilbage når en POST er modtaget.Når henholdsvis webserver-objektet starter, stopper eller modtager en POST, har jeg forsøgt mig at få den til at skrive i et tekst-felt via et event.
Foreløbig er det ikke lykkedes mig :-(
Jeg har tre kontroller i min form (frmMain) ved navn txtConsole og btnExit, btnClearConsole.
txtConsole er en multiline TextBox, og btnExit + btnClearConsole er en Button.
Foreløbig er det delt op i to filer, min form-fil frmMain.vb og en class-fil til min webserver: webserver.vb
---- frmMain.vb ----
Imports System.Threading
Public Class frmMain
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Me.BeginInvoke(New MethodInvoker(AddressOf Me.Close)) 'afslut programmet
End Sub
Dim WithEvents oWebServer As WebServer
Dim tWebServer As Thread
Sub WebServer_OutputLineToConsoleHandler(ByVal Text As String) Handles oWebServer.OutputLineToConsole
txtConsole.AppendText(Text & vbCrLf)
End Sub
Private Sub RunWebServer()
oWebServer = New WebServer()
End Sub
Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Try
oWebServer.StopServer()
tWebServer.Abort()
Catch ex As Exception
'do nothing...
End Try
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
tWebServer = New Thread(AddressOf RunWebServer)
tWebServer.Start()
End Sub
Private Sub btnClearConsole_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClearConsole.Click
txtConsole.Text = ""
End Sub
End Class
---- WebServer.vb ----
Imports System
Imports System.Collections.Specialized
Imports System.IO
Imports System.Net
Imports System.Threading
Public Class WebServer
Private RunWebServer As Boolean = True
Public Event OutputLineToConsole(ByVal Text As String)
Public Sub New()
Dim srv As New HttpListener()
srv.Prefixes.Add("http://localhost:800/")
srv.Start()
RaiseEvent OutputLineToConsole("Server started.")
Dim LoopCounter As Int64 = 0
While Thread.VolatileRead(RunWebServer) = True
LoopCounter = LoopCounter + 1
Dim ctx As HttpListenerContext = srv.GetContext()
Dim req As HttpListenerRequest = ctx.Request
Dim resp As HttpListenerResponse = ctx.Response
'Console.WriteLine(req.Url.AbsolutePath)
For Each k As String In req.Headers.AllKeys
RaiseEvent OutputLineToConsole(k & " = " & req.Headers(k))
Next
For Each k As String In req.QueryString.AllKeys
RaiseEvent OutputLineToConsole(k & " = " & req.QueryString(k))
Next
Dim sw As New StreamWriter(resp.OutputStream)
sw.WriteLine("POST modtaget")
sw.Close()
Application.DoEvents()
End While
RaiseEvent OutputLineToConsole("Server stopped.")
srv.Stop()
srv.Close()
End Sub
Public Sub StopServer()
Thread.VolatileWrite(RunWebServer, False)
End Sub
End Class
Nogen der kan fortælle mig hvordan jeg kommer videre - hvis jeg har grebet det forkert an, er jeg selvfølgelig åben for andre forslag :-)