如何在一个会话(JSESSIONID)/ cookie中发出两个POST请求

时间:2016-05-12 17:51:04

标签: c# cookies httpwebrequest jsessionid flowgear

好的,这是一个复杂的问题。经过两天半的研究和调试,我现在在这里。

目标: 从政府GST / HST查找网站获取数据。由于它是旧的(用作Java applet)并且没有REST API支持,我必须手动对网站进行2次Web请求。 (经过一整天的调试后,我发现在开始搜索之前我必须先接受条款和conds,因为接受存储在cookie中。网站链接在这里:ACTION_PASSWORD_CHANGED broadcasts

遇到的问题: Flowgear的Web请求节点不允许您指定“Cookie”标头,因此我无法告诉它在两个单独的请求中使用特定的cookie。所以我必须这样做:Government Search Website

注意: 我正在尝试在两个POST请求中使用相同的Cookie,以便为该特定会话获取正确的数据。

当前问题: 我收到此错误:“脚本执行错误:无法使用此动词类型发送内容正文。”

代码:

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;
    }
}

}

调试: 如果我删除除了return语句之外的'Part 2'下的所有内容,第一个POST工作正常。 在此之前,我在自己的脚本节点中有第2部分,它成功返回数据,但搜索结果丢失了。 (由于会话信息/ cookie信息未被转移)

重要提示:我已经在Postman上完成了这两个请求,并且在那里成功运行。

如何通过flowgear向本网站提交数据发布请求的任何想法将不胜感激。 :(

更新:对于第二个POST请求,我意识到我忘了更改

using (var stream = request.GetRequestStream())

匹配响应对象'request2':

using (var stream = request2.GetRequestStream())

网络请求现在成功运行!解决!

但是,我的问题仍然存在:如何让两个单独的请求共享一个cookie或会话?如何将Connection头属性设置为'Keep-alive'?

1 个答案:

答案 0 :(得分:0)

尝试为Web请求创建连接并为会话密钥属性提供值。然后在两个请求上使用相同的连接,这使它们共享相同的cookie jar。您无需手动尝试注入标题。

请注意,cookie jar的范围限定为Flowgear站点,并且位于内存中,因此您可以在不同的工作流程中拥有这两个请求。例如。一个在父母中,一个在子工作流中。