Как сделать два POST-запроса за один сеанс (JSESSIONID)/cookie

Итак, это сложный вопрос. Прошло более двух с половиной дней исследований и отладки, и я сейчас здесь.

Цель: получить данные с правительственного поискового веб-сайта GST/HST. Так как он старый (используется как Java-апплет) и не поддерживает REST API, мне нужно вручную выполнить 2 веб-запроса к веб-сайту. (После целого дня отладки я обнаружил, что должен сначала принять условия и условия, прежде чем начинать поиск, поскольку это принятие хранится в файле cookie. Ссылка на веб-сайт находится здесь: веб-сайт правительственного поиска)

Обнаружена проблема: узел веб-запроса Flowgear не позволяет вам указать заголовок "Cookie", поэтому я не могу сказать ему использовать определенный cookie для двух отдельных запросов. Итак, я должен был сделать это: Workflow

Примечание. Я пытаюсь использовать один и тот же файл Cookie для двух запросов POST, чтобы получить правильные данные для этого конкретного сеанса.

Текущая проблема: я получаю эту ошибку: "Ошибка выполнения скрипта: не удается отправить тело содержимого с этим типом глагола".

Код:

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

}

Отладка: если я удаляю все под "Part 2", кроме оператора return, первый POST работает нормально. До этого у меня была часть 2 в своем собственном узле сценария, и он успешно возвращал данные, но результаты поиска отсутствовали. (Поскольку информация о сеансе / информация о файлах cookie не была перенесена)

Важное примечание: я сделал именно эти два запроса на Почтальон, и он успешно работает там.

Будем весьма благодарны за любую идею о том, как отправить запрос на отправку с данными на этот сайт через flowgear.:(

ОБНОВЛЕНИЕ: для второго запроса POST я понял, что забыл изменить

using (var stream = request.GetRequestStream())

чтобы соответствовать объекту ответа 'request2':

using (var stream = request2.GetRequestStream())

Веб-запросы теперь успешно работают! Решено!

Тем не менее, мой вопрос все еще остается: как сделать два отдельных запроса для совместного использования файла cookie или сеанса и как установить для свойства заголовка соединения значение "Keep-alive"?

1 ответ

Решение

Попробуйте создать соединение для веб-запроса и указать значение свойства ключа сеанса. Затем используйте одно и то же соединение для двух запросов, чтобы они использовали один и тот же файл cookie. Вам не нужно пытаться вручную вводить заголовки.

Обратите внимание, что файл cookie находится на сайте Flowgear и находится в памяти, так что вы можете иметь два запроса в разных рабочих процессах. Например. Один в родительском, один в дополнительном рабочем процессе.

Другие вопросы по тегам