machen Okay, das ist eine komplizierte Frage. Es war über zweieinhalb Tage Forschung und Debugging und ich bin momentan hier.Wie zwei POST-Anfragen in einer Sitzung (JSESSIONID)/Cookie
Ziel: Daten von einer Government GST/HST-Lookup-Website abrufen. Da es alt ist (als Java-Applet verwendet) und keine REST-API-Unterstützung hat, muss ich manuell 2 Webanfragen an die Website stellen. (Nach einem ganzen Tag Debuggen fand ich, dass ich die Bedingungen und conds ersten akzeptieren müssen, bevor eine Suche starten, da diese Annahme in einem Cookie gespeichert wird, um die Verbindung der Website ist hier:. Government Search Website)
Problem aufgetreten: Flowgear der Der Webanforderungsknoten erlaubt Ihnen nicht, einen 'Cookie'-Header anzugeben, so dass ich nicht sagen kann, dass er ein bestimmtes Cookie für zwei separate Anfragen verwenden soll. Also musste ich das tun:
Hinweis: Ich versuche, den gleichen Cookie auf zwei POST-Anfragen zu verwenden, damit ich richtige Daten für diese bestimmte Sitzung zurück bekomme.
Aktuelles Problem: Ich erhalte diesen Fehler: "Script-Ausführungsfehler: Kann einen Inhalts-Body mit diesem Verb-Typ nicht senden."
Code:
using System;
using System.IO;
using System.Collections.Generic;
using System.Xml;
using System.Linq;
using System.Xml.Linq;
using System.Net;
using System.Text;
namespace CSharpScript
{
public partial class Processor
{
public object Process()
{
var request = (HttpWebRequest)WebRequest.Create("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryservlet");
var postData = "iagree=yes";
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.KeepAlive = true;
request.Host = "www.businessregistration-inscriptionentreprise.gc.ca";
Uri target = new Uri("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryservlet");
CookieContainer reqCookies = new CookieContainer();
request.CookieContainer = reqCookies;
request.CookieContainer.Add(new Cookie("id","YxmlT6nC0FPUakMqOF7S5ZGM-URCkTR-sjddOY02Gz2XfOodrOia!1465666898"){ Domain = target.Host });
//request.Headers["Cookie"] = "YxmlT6nC0FPUakMqOF7S5ZGM-URCkTR-sjddOY02Gz2XfOodrOia!1465666898";
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
//Part 2
var request2 = (HttpWebRequest)WebRequest.Create("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryPromptSubmit.do");
var postData2 = "businessName=COMPANYNAMEASSTRINGGOESHERE";
postData2 += "&businessNumber=SOMENUMBERGOESHERE";
postData2 += "&requestDate=2014-09-02";
var data2 = Encoding.ASCII.GetBytes(postData2);
request2.Method = "POST";
request2.ContentType = "application/x-www-form-urlencoded";
request2.ContentLength = data2.Length;
request2.KeepAlive = true;
request2.Host = "www.businessregistration-inscriptionentreprise.gc.ca";
//Uri target = new Uri("https://www.businessregistration-inscriptionentreprise.gc.ca/ebci/brom/registry/registryservlet");
request2.CookieContainer = reqCookies;
//request.Headers["Cookie"] = "YxmlT6nC0FPUakMqOF7S5ZGM-URCkTR-sjddOY02Gz2XfOodrOia!1465666898";
using (var stream = request.GetRequestStream())
{
stream.Write(data2, 0, data2.Length);
}
var response2 = (HttpWebResponse)request2.GetResponse();
responseString = new StreamReader(response2.GetResponseStream()).ReadToEnd();
return responseString;
}
}
}
Debugging: Wenn ich alles entfernen unter 'Teil 2' mit Ausnahme der return-Anweisung, die erste POST funktioniert gut. Vorher hatte ich Teil 2 in einem eigenen Skript-Knoten und es gab Daten erfolgreich zurück, aber die Suchergebnisse fehlten. (Da die Sitzungsinfo/Cookie-Info nicht übernommen wurde)
Wichtiger Hinweis: Ich habe genau diese zwei Anfragen an Postman gemacht und es funktioniert dort erfolgreich.
Jede Idee, wie Sie eine Postanforderung mit Daten an diese Website durch Flowgear übermitteln, würde sehr geschätzt werden. :(
UPDATE: Für die zweite POST-Anfrage wurde mir klar, ich
using (var stream = request.GetRequestStream())
passen das Antwortobjekt 'request2' zu ändern vergessen:
using (var stream = request2.GetRequestStream())
Die Web-Anfragen jetzt erfolgreich arbeiten Gelöst !
Allerdings bleibt meine Frage: Wie mache ich zwei separate Anfragen teilen einen Cookie oder Sitzung und wie setze ich die Connection-Header-Eigenschaft auf "Keep-alive"?
Ich kann nicht scheinen, die SessionKey -Eigenschaft im Web Request-Knoten und was meinst du die gleiche Verbindung für zwei Anfragen? Wie in eine neue Verbindung für die Verbindungseigenschaft machen und beide auf die gleiche setzen? – ykadaru
Diese Eigenschaft ist auf der Verbindung nicht der Knoten selbst. Werfen Sie einen Blick auf http://developers.flowgear.net/kb/Node:Web_Request – Daniel
Ahhh okay! Danke, das hilft sehr. – ykadaru