Как сделать два POST-запроса за один сеанс (JSESSIONID)/cookie
Итак, это сложный вопрос. Прошло более двух с половиной дней исследований и отладки, и я сейчас здесь.
Цель: получить данные с правительственного поискового веб-сайта GST/HST. Так как он старый (используется как Java-апплет) и не поддерживает REST API, мне нужно вручную выполнить 2 веб-запроса к веб-сайту. (После целого дня отладки я обнаружил, что должен сначала принять условия и условия, прежде чем начинать поиск, поскольку это принятие хранится в файле cookie. Ссылка на веб-сайт находится здесь: веб-сайт правительственного поиска)
Обнаружена проблема: узел веб-запроса Flowgear не позволяет вам указать заголовок "Cookie", поэтому я не могу сказать ему использовать определенный cookie для двух отдельных запросов. Итак, я должен был сделать это:
Примечание. Я пытаюсь использовать один и тот же файл 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 и находится в памяти, так что вы можете иметь два запроса в разных рабочих процессах. Например. Один в родительском, один в дополнительном рабочем процессе.