Toon posts:

[VB.NET] POST code uit PHP uitvoeren

Pagina: 1
Acties:

Vraag


Acties:
  • 0Henk 'm!

  • Atmoz
  • Registratie: Juli 2001
  • Laatst online: 10-08 08:07
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
  • Nu online
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: 10-08 08:07
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: 19:16

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: 10-08 08:07
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: 19:16

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: 10-08 08:07
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: 19:16

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



Nintendo Switch (OLED model) Apple iPhone SE (2022) LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S22 Garmin fēnix 7 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