.NET 4.x Получение cookie из POST/GET запросов - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Писал программу на C#. Задача состояла в том чтобы отправить запрос на сервер и при успешной авторизации получить заветные КУКИ! При этом у меня возникла масса проблем, у меня почему-то бралось только 1 значение КУКИ с параметром HTTPonly. Брал куки с помощью CookieContainer простым способом:
string data = "login=" + c_login + "&pass=" + c_password + "&LOGIN_redirect=1&lreseted=0&preseted=0";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.heroeswm.ru/login.php");
request.Method = "POST";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.AllowAutoRedirect = false;
request.ContentType = "application/x-www-form-urlencoded";
byte[] EncodedPostParams = Encoding.GetEncoding(1251).GetBytes(data);
request.ContentLength = EncodedPostParams.Length;
request.GetRequestStream().Write(EncodedPostParams, 0, EncodedPostParams.Length);
request.GetRequestStream().Close();
 
CookieContainer authInfo = new CookieContainer();
request.CookieContainer = authInfo;
 
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
authInfo = request.CookieContainer;
Ну и что, получаю в CookieContainer ТОЛЬКО ОДНО ПОЛЕ: PHPSESSID; А их там помимо этого еще очень много. И я себе думаю, ну может какая-то защита на сервере или еще что-то пошло не так... Но тут я решаю воспользоваться cURL в PHP. Пишу идентичный код:
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.heroeswm.ru/login.php');
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, 'login=' . $login
                                                                   . '&pass=' . $password
                                               . '&LOGIN_redirect=1&lreseted=0&preseted=0');
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0');                  
        
curl_setopt ($curl, CURLOPT_COOKIEFILE, 'c.txt');
curl_setopt ($curl, CURLOPT_COOKIEJAR, 'c.txt');
        
$res = curl_exec($curl);
        
if(!$res)
{
    $error = curl_error($curl).'('.curl_errno($curl).')';
    return $error;
}
else
{
    curl_close($curl);
    return $res;
}
И что в итоге? А вот что:
sid 96647ba3b1db5f183807c1c2e9e164c0 pl_id 4198923 PHPSESSID 59fdd35df6d800a8faa3316950850ead
Этот текст сгенерировали эти строки:
curl_setopt ($curl, CURLOPT_COOKIEFILE, 'c.txt');
curl_setopt ($curl, CURLOPT_COOKIEJAR, 'c.txt');
И самое главное, я получил помимо

PHPSESSID

так нужные мне

sid

и

pl_id

. Тоесть я получил все. Результат. Почему С# не делает то что сделал PHP. Я сомневаюсь что C# сильно этому PHP уступает. Значит Я что-то делаю не так... Так вот, в чем собственно проблема? Может использовать какой-то другой метод чтобы получит все куки? Подскажите... Заранее благодарен.

Не по теме:

PS: Тема: "C# слаб?" - просто хотел привлечь внимание.

Решение задачи: «.NET 4.x Получение cookie из POST/GET запросов»

textual
Листинг программы
string data = "login=" + c_login + "&pass=" + c_password + "&LOGIN_redirect=1&lreseted=0&preseted=0";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.heroeswm.ru/login.php");
request.Method = "POST";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";  
request.ContentType = "application/x-www-form-urlencoded";
request.AllowAutoRedirect = false;
CookieContainer authInfo = new CookieContainer();
request.CookieContainer = authInfo;
 
byte[] EncodedPostParams = Encoding.GetEncoding(1251).GetBytes(data);
request.ContentLength = EncodedPostParams.Length;
request.GetRequestStream().Write(EncodedPostParams, 0, EncodedPostParams.Length);
request.GetRequestStream().Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
MessageBox.Show(request.CookieContainer.GetCookieHeader(request.RequestUri));

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы