Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мистический баг или я слепой? Помогите... Готов даже заплатить... 
:(
    Опции темы
gogzor
Дата 5.11.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 21.9.2006

Репутация: нет
Всего: нет



Всем привет.
Вообщем я уже совсем выбился из графика...

Задача :
Есть программа , которая должна авторизироваться на форуме с движком vBulletin.

Внимание : Дам на пиво тому , кто сможет мне помочь!  smile 

Вот консольная программка , которая это делает :
Код

//Это метод авторизации , возвращает True если операция успешна
private static bool SendPostRequest(string target, string endPage, string queryString, string confirmString)
        {
            //Target - URL форума где авторизироваться (например http://forum.com/index.php?do=login)
            //endPage - Index страница форума , для проверки авторизации (например http://forum.com/index.php)
            //queryString - Строка POST запроса (например vb_login_username=test&vb_login_password=test123&s=&do=login)
            //confirmString - Регулярное выражение для проверки авторизации (например @"last.visited")

            bool result = false;
            CookieContainer cont = new CookieContainer(); //Контейнер для хранения кук

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(target); //создаем ПОСТ запрос
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = queryString.Length;
            request.Method = "POST";
            request.AllowAutoRedirect = false;
            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)";
            request.CookieContainer = cont; //указываем где хранить куки
            
            //Отправляем ПОСТ запрос
            Stream requestStream = request.GetRequestStream();
            byte[] postBytes = Encoding.ASCII.GetBytes(queryString);
            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();

            HttpWebResponse response = (HttpWebResponse) request.GetResponse();
            cont.Add(response.Cookies); //набиваем контейнер куками с полученного ответа
            response.Close();
 
            //Делаем запрос на иднексовую страницу с нужными куками , и проверяем , залогинились или нет
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(endPage);
            req.Method = "GET";
            req.UserAgent = USER_AGENT;
            req.CookieContainer = cont; //указываем наш контейнер с куками

            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            string content2 = new StreamReader(resp.GetResponseStream()).ReadToEnd(); //получаем ХТМЛ
         
            //Проверяем на confirmString 
            if (Regex.IsMatch(content2, confirmString, RegexOptions.IgnoreCase | RegexOptions.Multiline))
            {
                result = true;
            }
            resp.Close();

            return result;
        }


Так вот из консольной проги этот код работает успешно и возвращает True!
Я копирую этот код и вставляю его в WinForms приложение , и при нажатии на кнопку вызываю его со всеми параметрами. Но именно в WinForms он возвращает FALSE!! Почему так???

Вот код WinForms :

Код

public bool SendPostRequest(string target, string endPage, string queryString, string confirmString)
        {
            bool result = false;

            CookieContainer cont = new CookieContainer();

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(target);
            request.ContentType = CONTENT_TYPE;
            request.ContentLength = queryString.Length;
            request.Method = "POST";
            request.AllowAutoRedirect = false;
            request.UserAgent = USER_AGENT;
            request.CookieContainer = cont;

            Stream requestStream = request.GetRequestStream();
            byte[] postBytes = Encoding.ASCII.GetBytes(queryString);
            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            cont.Add(response.Cookies);
            response.Close();

            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(endPage);
            req.Method = "GET";
            req.UserAgent = USER_AGENT;
            req.CookieContainer = cont;

            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            string content2 = new StreamReader(resp.GetResponseStream()).ReadToEnd();

            if (Regex.IsMatch(content2, confirmString, RegexOptions.IgnoreCase | RegexOptions.Multiline))
            {
                result = true;
            }
            resp.Close();

            return result;
        }

//Вызов с кнопки 

private void button1_Click(object sender, EventArgs e)
        {
            bool auth = SendPostRequest("http://forum.com/index.php?do=login", "http://forum.com/index.php", 
                                                            "vb_login_username=test&vb_login_password=test123&s=&do=login", "last.visited");

            MessageBox.Show(auth.ToString()); //ВОЗВРАЩАЕТ FALSE!!!!!!!!! 
        }


Люди в чём глюк? Или я уже не замечаю ошибку? Помогите плиз...
PM MAIL   Вверх
Experimenter
Дата 5.11.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



gogzor, попробуй и в консоли, и в виндовой форме явно указать кодировку принимаемого сообщения: 
Код

string content2 = new StreamReader(resp.GetResponseStream(), Encoding.GetEncoding(1251)).ReadToEnd();
Второе: выведи то, что принимаешь, в отладочное окно.
Третье: еще раз проверь параметры, передаваемые на вход функции.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
gogzor
Дата 5.11.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 21.9.2006

Репутация: нет
Всего: нет



Единственное что я сейчас заметил , так это то , что в консольном приложении CookieContainer получает от ответа 3 куки ,  а в Winforms только 2.... Теряется кука с sessionhash ... вот в чём проблема наверное. А почему она теряется я не понимаю.
PM MAIL   Вверх
Experimenter
Дата 5.11.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



gogzor, тогда третье: где-то что-то теряешь. Выводи полностью все в отладку (вплоть до всех заголовков) и сравнивай.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
gogzor
Дата 5.11.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 21.9.2006

Репутация: нет
Всего: нет



Обнаружил ещё одно чудо... Периодически в контейнер добавляются все 3 куки... Т.е в контейнере содержаться все данные для корректной работы в авторизированном режиме. Но вот даже когда все эти данные собраны , он всё равно не залогинивается туда... Это именно из Winforms такое... В консольное аппликашке всё на ура работает.

Люди помогте разобраться и я вам пиво поставлю  smile 
PM MAIL   Вверх
mr.DUDA
Дата 6.11.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



А куки откуда подгружаются (не из IE, случаем)? Может отсюда ноги растут у бага?


--------------------
user posted image
PM MAIL WWW   Вверх
Jamon
Дата 7.11.2008, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 1.9.2007

Репутация: нет
Всего: нет



Цитата(mr.DUDA @ 6.11.2008,  00:37)
А куки откуда подгружаются (не из IE, случаем)? Может отсюда ноги растут у бага?

а как они оттуда могут подгружаться при использовании httpWebRequest/httpWebResponse ?
PM MAIL   Вверх
mr.DUDA
Дата 7.11.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Сорри, затупил, поздно было  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
PashaPash
Дата 8.11.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



gogzor, а почему у тебя вообще код в консольном приложении и в винфомах отличается? Пересели SendPostRequest в winforms как есть, проверь, и потом уже меняй. А то у тебя куча изменений, которые не видны из показанного кода - вдруг ты константы типа CONTENT_TYPE неправильно определил. А еще лучше - вообще не выноси такие вещи к константы, оставляй как есть - смысла в строчке request.ContentType = CONTENT_TYPE намного меньше чем в request.ContentType = "application/x-www-form-urlencoded".


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.