Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

[VB.NET] POST code uit PHP uitvoeren

Pagina: 1
Acties:

Vraag


Acties:
  • 0Henk 'm!

  • Atmoz
  • Registratie: juli 2001
  • Laatst online: 13-06 08:19
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:
  • +1Henk 'm!

  • nescafe
  • Registratie: januari 2001
  • Laatst online: 00:26
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


  • Atmoz
  • Registratie: juli 2001
  • Laatst online: 13-06 08:19
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:
  • +1Henk 'm!

  • Reptile209
  • Registratie: juni 2001
  • Laatst online: 00:12

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.

If you're not part of the solution, you're part of the precipitate.


  • Atmoz
  • Registratie: juli 2001
  • Laatst online: 13-06 08:19
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:
  • +1Henk 'm!

  • Reptile209
  • Registratie: juni 2001
  • Laatst online: 00:12

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.

If you're not part of the solution, you're part of the precipitate.


  • Atmoz
  • Registratie: juli 2001
  • Laatst online: 13-06 08:19
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:
  • +1Henk 'm!

  • Reptile209
  • Registratie: juni 2001
  • Laatst online: 00:12

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

If you're not part of the solution, you're part of the precipitate.

Pagina: 1


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 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 - 2021 Hosting door True