[VB.NET] POST code uit PHP uitvoeren

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 28-06 08:47

Atmoz

Techno!!

Topicstarter
Beste allemaal,

Graag zou ik een POST commando (HTTP) uit een bepaald PHP-script (zie hieronder) uit laten voeren in m'n VB.NET applicatie zodat ik niet ook nog iets van een webserver (mét PHP) nodig heb...

Dit is de (PHP) code voor het POST commando:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public function SetQueue($queue)
    {

$content='POST /MediaRenderer/AVTransport/Control HTTP/1.1
CONNECTION: close
HOST: '.$this->address.':1400
CONTENT-LENGTH: '.(342+strlen(htmlspecialchars($queue))).'
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><CurrentURI>'.htmlspecialchars($queue).'</CurrentURI><CurrentURIMetaData></CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>';

        $this->sendPacket($content);
    }


In PHP werkt dit perfect, maar ik krijg het in VB.NET maar niet werkend 8)7 (van vanmorgen vroeg tot nu.. grrrr :( O-) )


Mijn stukje code in VB.NET is als volgt:

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
    Private Sub SetQueue()

        Try

            Dim s As HttpWebRequest
            Dim postdata As String
            s = HttpWebRequest.Create("http://192.168.1.216:1400/MediaRenderer/AVTransport/Control")

            Dim effe As String = "x-rincon-queue:RINCON_00:0E:58:A4:4B:68:01400#0"

            postdata = My.Computer.FileSystem.ReadAllText("SetQueue.txt")

            Dim bArray As Byte() = Encoding.UTF8.GetBytes(postdata)

            s.Host = "192.168.1.216:1400"
            s.Headers.Add("SOAPACTION", "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI")
            s.Method = "POST"
            s.ContentType = "text/xml"
            s.ContentLength = bArray.Length

            Using stream = s.GetRequestStream()
                stream.Write(bArray, 0, bArray.Length)
            End Using
            Dim result = s.GetResponse()

        Catch ex As Exception

        End Try

    End Sub


Ik weet niet goed hoe ik de "postdata" netjes in een String krijg, dus ik heb dat stukje in een textfile (SetQueue.txt) gezet zodat het daaruit wordt gehaald. De inhoud van SetQueue.txt is:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"><InstanceID>0</InstanceID><CurrentURI>x-rincon-queue:RINCON_000E58A44B6801400#0</CurrentURI><CurrentURIMetaData></CurrentURIMetaData></u:SetAVTransportURI></s:Body></s:Envelope>
Zodra ik deze code uitvoer hangt hij (volgens mij) vast bij:

code:
1
2
3
            Using stream = s.GetRequestStream()
                stream.Write(bArray, 0, bArray.Length)
            End Using



Wat gaat hier verkeerd?

Alvast thanks voor 't meedenken _/-\o_

Alle reacties


Acties:
  • +1 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 11:36
Ik zou er zoiets van maken. Note that VB.NET inline XML ondersteunt en dat kun je hier prima gebruiken.

Probeer vooral geen fouten te onderdrukken, vang ze op een hoger niveau af en toon ze aldaar aan de gebruiker.

Visual Basic .NET:
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
Imports System.Net

Public Sub Main
  MessageBox.Show(SetQueue("x-rincon-queue:RINCON_000E58A44B6801400#0"))
End Sub

Private Function SetQueue(uri As String) As String

  Dim data =
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <s:Body>
        <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
          <InstanceID>0</InstanceID>
          <CurrentURI><%= uri %></CurrentURI>
          <CurrentURIMetaData></CurrentURIMetaData>
        </u:SetAVTransportURI>
      </s:Body>
    </s:Envelope>.ToString()

  Using client As New WebClient()
    client.Headers.Add("SOAPACTION", "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI")
    client.Headers.Add(HttpRequestHeader.ContentType, "text/xml")
    Return client.UploadString("http://192.168.1.216:1400/MediaRenderer/AVTransport/Control", data)
  End Using

End Function

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 28-06 08:47

Atmoz

Techno!!

Topicstarter
nescafe schreef op zondag 28 juni 2020 @ 23:40:
Ik zou er zoiets van maken. Note that VB.NET inline XML ondersteunt en dat kun je hier prima gebruiken.
Ah, thanks! Dat wist ik niet. Is wel heel handig ja :)
Probeer vooral geen fouten te onderdrukken, vang ze op een hoger niveau af en toon ze aldaar aan de gebruiker.

Visual Basic .NET:
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
Imports System.Net

Public Sub Main
  MessageBox.Show(SetQueue("x-rincon-queue:RINCON_000E58A44B6801400#0"))
End Sub

Private Function SetQueue(uri As String) As String

  Dim data =
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <s:Body>
        <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
          <InstanceID>0</InstanceID>
          <CurrentURI><%= uri %></CurrentURI>
          <CurrentURIMetaData></CurrentURIMetaData>
        </u:SetAVTransportURI>
      </s:Body>
    </s:Envelope>.ToString()

  Using client As New WebClient()
    client.Headers.Add("SOAPACTION", "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI")
    client.Headers.Add(HttpRequestHeader.ContentType, "text/xml")
    Return client.UploadString("http://192.168.1.216:1400/MediaRenderer/AVTransport/Control", data)
  End Using

End Function
Ook Thanks voor je code! _/-\o_ Maar helaas werkt dit ook niet :|
Het programma "bevriest" op deze regel:

Return client.UploadString("http://192.168.1.216:1400/MediaRenderer/AVTransport/Control", data)

Ik heb gisteren tijdens (het letterlijk de hele dag) testen/proberen ook al allerlei andere manieren geprobeerd. Maar steeds blijft hij bij dat "SetQueue" commando hangen.

Het rare is, sommige commando's (die eigenlijk precies hetzelfde werken) kreeg ik wel netjes "geport" van PHP naar VB.NET
Bijvoorbeeld onderstaande code werkt perfect:

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
    Private Sub SONOS_AddToQueue(Mp3_file As String)

        Try

            Dim s As HttpWebRequest
            Dim enc As UTF8Encoding
            Dim postdata As String
            s = HttpWebRequest.Create("http://192.168.1.216:1400/MediaRenderer/AVTransport/Control")
            enc = New System.Text.UTF8Encoding()

            postdata = My.Computer.FileSystem.ReadAllText("SONOS_PlayMP3_1.txt") & Mp3_file & My.Computer.FileSystem.ReadAllText("SONOS_PlayMP3_2.txt")

            Dim bArray As Byte() = Encoding.UTF8.GetBytes(postdata)

            s.Host = "192.168.1.216:1400"
            s.Headers.Add("SOAPACTION", "urn:schemas-upnp-org:service:AVTransport:1#AddURIToQueue")
            s.Method = "POST"
            s.ContentType = "text/xml"
            s.ContentLength = bArray.Length

            Using stream = s.GetRequestStream()
                stream.Write(bArray, 0, bArray.Length)
            End Using
            Dim result = s.GetResponse()

        Catch ex As Exception

        End Try

    End Sub



Echt super raar toch?! :?


[edit]

Hmzzz, ik ben alweer een HEEL stuk verder :9

Ik had ondertussen een aantal verschillende "SetQueue"-functies (als test) gemaakt.
Allemaal blijken ze te werken zodra ik:

code:
1
ServicePointManager.DefaultConnectionLimit = 4


vooraan in de functie neerzet.
Alles werkt ook nu _/-\o_

MAAR: er is één probleem: wel maar voor 1x 8)7 Zodra ik 2x (met zelfs meerdere seconden ertussen) op de button klik, hangt het programma weer vast.

Iets laat me dus denken dat op een gegeven moment de connections "vol lopen". (of in ieder geval het aantal).
Hoe/waar zou ik dit kunnen "resetten"?

[edit2]

Met andere woorden: als ik ServicePointManager.DefaultConnectionLimit op 9999 zet werkt het "VOORLOPIG" prima :P :P :P :P
Maarja, iets zegt me dat dit niet heel netjes is....

[ Voor 11% gewijzigd door Atmoz op 29-06-2020 06:08 ]


Acties:
  • +1 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 14:41

Reptile209

- gers -

Atmoz schreef op maandag 29 juni 2020 @ 05:15:
[...]

Iets laat me dus denken dat op een gegeven moment de connections "vol lopen". (of in ieder geval het aantal).
Hoe/waar zou ik dit kunnen "resetten"?

[edit2]

Met andere woorden: als ik ServicePointManager.DefaultConnectionLimit op 9999 zet werkt het "VOORLOPIG" prima :P :P :P :P
Maarja, iets zegt me dat dit niet heel netjes is....
Was je dit verhaal: Understanding MaxServicePointIdleTime and DefaultConnectionLimit al tegen gekomen? Dat geeft wat meer context aan je vraag. Inderdaad is een te grote waarde niet persé handig.

Misschien een antwoord in de juiste richting erbij:
C++:
1
2
3
HttpWebResponse aResp = aReq.GetResponse() as HttpWebResponse;
System.Threading.Thread.Sleep(500); //simulate a half second delay for the server to process the request
aResp.Close(); // if you do not do this close, you will timeout for sure! The socket will not be freed.

die laatste regel: sluit jouw programma zelf de verbinding (ook)? Anders staat hij daar een socket te laten wachten tot het einde der tijden en loop je daarom misschien tegen een freeze aan.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 28-06 08:47

Atmoz

Techno!!

Topicstarter
Reptile209 schreef op maandag 29 juni 2020 @ 11:15:
[...]

Was je dit verhaal: Understanding MaxServicePointIdleTime and DefaultConnectionLimit al tegen gekomen? Dat geeft wat meer context aan je vraag. Inderdaad is een te grote waarde niet persé handig.
Thanks!
Misschien een antwoord in de juiste richting erbij:
C++:
1
2
3
HttpWebResponse aResp = aReq.GetResponse() as HttpWebResponse;
System.Threading.Thread.Sleep(500); //simulate a half second delay for the server to process the request
aResp.Close(); // if you do not do this close, you will timeout for sure! The socket will not be freed.

die laatste regel: sluit jouw programma zelf de verbinding (ook)? Anders staat hij daar een socket te laten wachten tot het einde der tijden en loop je daarom misschien tegen een freeze aan.
Waar moet ik dat ".Close()" zetten?

Als ik helemaal onderaan de functie s.Close() zet, komt er:
'close' is not a member of 'HttpWebRequest'.
Dus ik snap niet precies waar in de code ik dat moet plaatsen...

Acties:
  • +1 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 14:41

Reptile209

- gers -

In dat voorbeeld doen ze:
code:
1
HttpWebResponse aResp = aReq.GetResponse() as HttpWebResponse;
gevolgd door
code:
1
aResp.Close();


Jij doet:
code:
1
Dim result = s.GetResponse()

Het zou dus iets van result.Close(); moeten zijn, maar dan moet je wel even de juiste types gebruiken - zie voorbeeld van Microsoft.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 28-06 08:47

Atmoz

Techno!!

Topicstarter
Reptile209 schreef op maandag 29 juni 2020 @ 15:52:
In dat voorbeeld doen ze:
code:
1
HttpWebResponse aResp = aReq.GetResponse() as HttpWebResponse;
gevolgd door
code:
1
aResp.Close();


Jij doet:
code:
1
Dim result = s.GetResponse()

Het zou dus iets van result.Close(); moeten zijn, maar dan moet je wel even de juiste types gebruiken - zie voorbeeld van Microsoft.
Ah cool, 't werkt _/-\o_
Nu is het echt mooi :9 8)

Merci!!!

Acties:
  • +1 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 14:41

Reptile209

- gers -

Atmoz schreef op maandag 29 juni 2020 @ 16:06:
[...]

Ah cool, 't werkt _/-\o_
Nu is het echt mooi :9 8)

Merci!!!
Mooi zo. Snap je ook waarom het werkt? Want van copy-paste programmeren wordt je uiteindelijk niet vrolijk! Dus lees vooral die blog (nog) een keer rustig door, dan heb je er een volgende keer ook nog wat aan en ben je een iets betere programmeur geworden.

Ik heb overigens zelf niet eens verstand van dit specifieke probleem, 2e hit op zoeken bij google naar 'ServicePointManager.DefaultConnectionLimit' bracht me die blog O-) . #tipvoordevolgendekeer

Zo scherp als een voetbal!

Pagina: 1