Toon posts:

[VB.NET] Hele simpele webserver in Windows-form-applicatie

Pagina: 1
Acties:

Vraag


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 10-09 19:34
Beste allemaal,

Graag zou ik in mijn (bestaande) Windows Form Applicatie een simpele webserver maken zodat uiteindelijk de code die nu achter "button1" zit (en je dus alleen op de PC waar je de Form-applicatie draait kunt starten) ook via een andere computer in het netwerk gestart kan worden door middel van het browsen naar een bepaalde URL.

Ik kwam tijdens mijn zoektocht dit stukje code tegen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Imports System.Net
Imports System.Globalization

Module HttpListener

    Sub Main()
        Dim prefixes(0) As String
        prefixes(0) = "http://*:8080/HttpListener/"
        ProcessRequests(prefixes)
    End Sub

    Private Sub ProcessRequests(ByVal prefixes() As String)
        If Not System.Net.HttpListener.IsSupported Then
            Console.WriteLine( _
                "Windows XP SP2, Server 2003, or higher is required to " & _
                "use the HttpListener class.")
            Exit Sub
        End If

        ' URI prefixes are required,
        If prefixes Is Nothing OrElse prefixes.Length = 0 Then
            Throw New ArgumentException("prefixes")
        End If

        ' Create a listener and add the prefixes.
        Dim listener As System.Net.HttpListener = _
            New System.Net.HttpListener()
        For Each s As String In prefixes
            listener.Prefixes.Add(s)
        Next

        Try
            ' Start the listener to begin listening for requests.
            listener.Start()
            Console.WriteLine("Listening...")

            ' Set the number of requests this application will handle.
            Dim numRequestsToBeHandled As Integer = 10

            For i As Integer = 0 To numRequestsToBeHandled
                Dim response As HttpListenerResponse = Nothing
                Try
                    ' Note: GetContext blocks while waiting for a request.
                    Dim context As HttpListenerContext = listener.GetContext()

                    ' Create the response.
                    response = context.Response
                    Dim responseString As String = _
                        "<HTML><BODY>The time is currently " & _
                        DateTime.Now.ToString( _
                        DateTimeFormatInfo.CurrentInfo) & _
                        "</BODY></HTML>"
                    Dim buffer() As Byte = _
                        System.Text.Encoding.UTF8.GetBytes(responseString)
                    response.ContentLength64 = buffer.Length
                    Dim output As System.IO.Stream = response.OutputStream
                    output.Write(buffer, 0, buffer.Length)

                Catch ex As HttpListenerException
                    Console.WriteLine(ex.Message)
                Finally
                    If response IsNot Nothing Then
                        response.Close()
                    End If
                End Try
            Next
        Catch ex As HttpListenerException
            Console.WriteLine(ex.Message)
        Finally
            ' Stop listening for requests.
            listener.Close()
            Console.WriteLine("Done Listening...")
        End Try
    End Sub
End Module


bron: https://stackoverflow.com...-posts-simple-http-server

En dat werkt in principe al vrij aardig :)
Maar er zijn 2 "probleempjes"

1. In m'n Form-app komt nu steeds de melding *reageert niet*
2. Nu werkt de webserver zo, dat als ik naar http://192.168.1.212:8080/HttpListener/ ga, de tijd wordt weergegeven in de browser:
The time is currently 27-6-2020 14:22:12
Maar wat ik wil is dat als iemand naar die URL gaat, met daar bijvoorbeeld achter "?=test" dat er bijvoorbeeld een MsgBox met "test" erin verschijnt in de Form-App. (dit dus om te "bewijzen" dat ik dynamische strings kan doorsturen zodat ik daar later vanalles mee kan doen in de Form-App).


Hoe los ik puntje 1 op? En hoe maak ik puntje 2?

(ik denk zelf dat het "probleem" in punt 1 ontstaat omdat ik nu een Form gebruik, terwijl in het voorbeeld een Module wordt gebruikt zonder "Form" waar iets op kan gaan vasthangen)

Wie heeft er raad? _/-\o_

Beste antwoord (via Atmoz op 27-06-2020 18:37)


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Atmoz schreef op zaterdag 27 juni 2020 @ 18:07:
Ik kan "GetContext" helemaal nergens in de code vinden O-)
Bedoel je iets anders toevallig?
Ik zie het hier:

Visual Basic .NET:
43
44
' Note: GetContext blocks while waiting for a request.
Dim context As HttpListenerContext = listener.GetContext()


Volgens mij kan je dat dus vervangen door (moet je wel je functie Async maken en bij aanroep ook Await gebruiken; enzovoorts):

Visual Basic .NET:
43
Dim context As HttpListenerContext = Await listener.GetContextAsync()

Alle reacties


Acties:
  • +1Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
1 komt vrij zeker doordat je hem start in de ui-thread en hij wacht op de GetContext. Je kan proberen het op een andere thread uit te voeren met Task.Run: https://docs.microsoft.co...run?view=netframework-4.8 (rechtsboven VB kiezen)
edit:
Of misschien makkelijker/mooier GetContextAsync gebruiken: https://docs.microsoft.co...ync?view=netframework-4.8

2 context.Request geeft informatie over je aanroep. Daarin kan je zo te lezen in de QueryString je parameters vinden: https://docs.microsoft.co...ing?view=netframework-4.8

[Voor 14% gewijzigd door Daos op 27-06-2020 17:29]


  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 10-09 19:34
Daos schreef op zaterdag 27 juni 2020 @ 17:13:
1 komt vrij zeker doordat je hem start in de ui-thread en hij wacht op de GetContext. Je kan proberen het op een andere thread uit te voeren met Task.Run: https://docs.microsoft.co...run?view=netframework-4.8 (rechtsboven VB kiezen)
edit:
Of misschien makkelijker/mooier GetContextAsync gebruiken: https://docs.microsoft.co...ync?view=netframework-4.8

2 context.Request geeft informatie over je aanroep. Daarin kan je zo te lezen in de QueryString je parameters vinden: https://docs.microsoft.co...ing?view=netframework-4.8
Thanks voor je reactie!

Ik kan "GetContext" helemaal nergens in de code vinden O-)
Bedoel je iets anders toevallig?

Daardoor kan ik puntje 2 ook niet proberen :P

Acties:
  • Beste antwoord
  • +1Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Atmoz schreef op zaterdag 27 juni 2020 @ 18:07:
Ik kan "GetContext" helemaal nergens in de code vinden O-)
Bedoel je iets anders toevallig?
Ik zie het hier:

Visual Basic .NET:
43
44
' Note: GetContext blocks while waiting for a request.
Dim context As HttpListenerContext = listener.GetContext()


Volgens mij kan je dat dus vervangen door (moet je wel je functie Async maken en bij aanroep ook Await gebruiken; enzovoorts):

Visual Basic .NET:
43
Dim context As HttpListenerContext = Await listener.GetContextAsync()

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 10-09 19:34
YES! Het werkt :)
Sorry, was in de verkeerde applicatie bezig...
Had nog even snel een test-App gemaakt, en daar kon ik dat "context" niet in vinden...
Erg slordig. Mijn excuses!

Ontzettend bedankt voor de hulp. Echt gaaf dat 't werkt _/-\o_



Google Pixel 7 Sony WH-1000XM5 Apple iPhone 14 Samsung Galaxy Watch5, 44mm Sonic Frontiers Samsung Galaxy Z Fold4 Insta360 X3 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2022 Hosting door True

Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee