ich hab ein Problem mit HTTPSocket, dieser macht nicht was man von ihm erwartet.
Mein Code:
Dim DS_Url_Login As String = "http://" + txt_url.Text + ":" + txt_port.text + "/webapi/auth.cgi?api=SYNO.API.Auth&version=2&method=login&account=" + txt_user.text + "&passwd=" + txt_pw.text + "&session=DownloadStation&format=sid"
msgbox DS_Url_Login
if lb_links.ListCount < 1 then
msgbox "Es sind keine Links vorhanden."
else
Dim http As New HTTPSocket
Dim result As String = http.get(DS_Url_Login,15)
result = DefineEncoding(result, Encodings.UTF8)
Dim jResult As New JSONItem(result)
msgbox (result)
Dim v As Variant
v = jResult.Lookup("success", "not found")
If v = "not found" Then
MsgBox ("Die Diskstation antwortet nicht, eventuell ist die Adresse falsch?")
Else
If v = False Then
MsgBox ("Der Login ist fehlgeschlagen, es wurden falsche Login-Informationen benutzt.")
End If
If v = True Then
Dim DataItem As JSONItem = jResult.Value("data")
Dim SiD As String = DataItem.Value("sid")
Dim i as Integer
msgbox ("SID: " + SiD)
Dim DS_Link_URL as String = "http://" + txt_url.Text + ":" + txt_port.text + "/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=" + lb_links.Cell(1,0) + "&_sid=" + SiD
MsgBox (DS_Link_URL)
Dim httpDS As New HTTPSocket
Dim add_result As String = httpDS.get(DS_Link_URL,0)
add_result = DefineEncoding(result, Encodings.UTF8)
msgbox add_result
End If
End If
end if
So das Problem ist das der zweite HTTPSocket mit DS_Link_URL nicht funktioniert, bzw. er wartet ewig und macht nichts…wenn ich die generierte URL aus der MSG Box kopiere und in den Browser werfe…geht es innerhalb 1-2 Sekunden.
Nun der ist gerade synchron, das Programm wartet auch auf das Ergebnis, aber wie gesagt es tut sich nichts…das Programm bleibt einfach stehen, obwohl dieser aufruf der URL innerhalb von 1-2 Sekunden eine Antwort im Browser hervorruft und der erste Socket (http) antwortet auch recht fix, der zweite (httpDS) bleibt eben hängen und tut nichts…obwohl Link (DS_Link_URL) aus der Msgbox kopiert im Browser super funktioniert…eben deswegen kann ich mir keinen reim auf das verhalten machen…
Mmm ich hab gerade nicht die Möglichkeit Deinen Code zu testen, sehe aber dass Du immer MsgBoxen zum Anzeigen von Variablen verwendest. Das würde ich gerade bei Sockets, Threads oder generell bei irgendwelchen synchronen/assynchronen Verbindungen nicht tun. Verwende dafür besser DebugLog:
Danke für den Tipp, habe ich gleich mal probiert, das ist auch viel angenehmer da man die Ergebnisse danach nocht hat :), werden die im Build später entfernt?
Okay wenn wir schonmal dabei sind… probiere Deinen Link mit dem nachfolgenden Codesnippet und schau nach, was der Server Dir liefert. Wenn hier schon nichts kommt, dann prüfe den Server oder besser Deine lokale Firewall. Schalte diese probeweise mal aus und schau nochmal.
Nächster Punkt: Encode Deine URLs! Ein Leerzeichen oder Sonderzeichen und schon gibt’s falsche Ergebniss geben.
dim so as new HTTPSocket
dim r as string
r = so.Get(EncodeURLComponent("http://www.google.de"),3)
system.DebugLog r
Hm also mit deinem Encode erhlt man keine Antwort von Google. Ohne geht es…
Zum Thema Firewall und Server, es wird im LAN gearbeitet und es ist ein NAS, da gibt es leider nichts zu berprfen. Das Problem liegt entweder am Code oder Xojo bugt. Die URL, die Xojo erzeugt, funtioniert ja im Browser, auch bekommt der erste HTTPSocket ein Ergebnis.
Hier mal der Output aus dem Debug-Log, wie man sieht Antwortet der erste HTTPSocket mit dem Result, einem JSON, dem ich die SID entnehme und daraus den anderen Link (DSUrlAdd) baue. Dieser ist so auch richtig, wenn ich den in den Browser kopiere, geht er. Wenn der HTTPSocket keinen TimeOut hat, hngt das Programm auch bis in alle ewigkeit…
So langsam habe ich das Gefhl das mit dem HTTPSocket etwas nicht stimmt
rufst du das da oben wirklich mit timeout = 0 auf? Hast du da mal 15 oder so probiert?
Auerdem wenn du ein HTTPSocket als Control im Fenster nimmst oder eine eigene Klasse, kannst du im PageReceived event viel mehr Informationen bekommen, zum Beispiel wenn was schief geht.
Oder Umleitung bzw. Login falsch.
Sorry mein Fehler das mit dem EncodeURL. Dann lasses weg. Aber der Socket funktioniert, dann vermute ich eher, das Deine NAS eher eine Session erwartet oder etwas anderes. Ich würde den HTTP Post auswerten. Auch was Christian soeben gepostet hat macht sinn: Erhöhe den Timeout!
Nein sonst würde die URL mit der SID im Browser nicht funtkionieren und ein Success JSON schicken
[quote=156416:@Christian Schmitz]rufst du das da oben wirklich mit timeout = 0 auf? Hast du da mal 15 oder so probiert?
Außerdem wenn du ein HTTPSocket als Control im Fenster nimmst oder eine eigene Klasse, kannst du im PageReceived event viel mehr Informationen bekommen, zum Beispiel wenn was schief geht.
Oder Umleitung bzw. Login falsch.[/quote]
Hab auch schon 15 Probiert, hat nichts genützt, eigene Klasse? Wenn irgendwas falsch wär hätte ich einen entsprechenden JSON Output
mach ein neues Socket Objekt auf und versuche es mit der SID abzurufen. Ich kenne Deine NAS nicht und das lässt sich folglich auch schlecht nach vollziehen. Ich kann Dich in so fern aber beruhigen, dass ich keinerlei Probleme mit dem Socket hier habe…
So das Problem liegt am String, Xojo macht irgendwie etwas komisches…testcode:
Dim cell as string = lb_links.Cell(1,0)
Dim DSUrlAdd as String ="http://" + txt_url.Text + ":" + txt_port.text + "/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=" + cell + "&_sid=Hkjr3SHbtMlRg1420LRN000595"
Dim DSUrlAdd2 as string = "http://192.168.192.61:7878/webapi/DownloadStation/task.cgi?api=SYNO.DownloadStation.Task&version=1&method=create&uri=http://www.sys-worx.net/download/dlc1.zip&_sid=Hkjr3SHbtMlRg1420LRN000595"
System.DebugLog ("DSUrlAdd: " + DSUrlAdd)
System.DebugLog ("DSUrlAdd2: " + DSUrlAdd2)
Dim addlink As new HTTPSocket
Dim addresult As String = addlink.get(DSUrlAdd2,15)
addresult = DefineEncoding(addresult, Encodings.UTF8)
System.DebugLog ("addresult: " + addresult)
Benutze ich DSUrlAdd geht es nicht, verwende ich allerdings DSUrlAdd2 geht es.
Die man sieht macht Xojo mit dem String DSUrlAdd irgendwle einen Zeilelumbruch, der nicht da sein dürfte, während der DSUrlAdd2 korrekt dargestellt wird…mit DSUrlAdd2 antwortet das NAS innerhalb 1-2 Sekunden…
Scheint also an Xojo zu liegen, die zusammensetzung des Strings oben ist ja korrekt…?
Das EndofLine ist das Problem…ohhhjee manchmal sieht man den Wald vor lauter Bäumen nicht xD, komischerweise will er ohne das + EndOfLine nicht, aber mit + “” geht es
Ja mein Fehler ^^ bin halt verwöhnt die Visual-Studio, da kann einem so etwas gar nicht passieren ;), das EndOfLine kam da durch das es vorher eine Textbox war.