LINUX.ORG.RU

Программирование парсера в Mono


0

1

А суть вот в чём: пишу программу, которая собирает цены с разных сайтов. Программа дописывается постепенно, новые сайты добавляются по мере необходимости. Работает уже несколько лет и никто не жалуется, но периодически встает задача добавить новый сайт для сбора цен.
В принципе, это не сложно - сделал довольно удобный класс для этого. Работать с ним легко - сам собирает куки, понимает ответы сервера о переадресации и делает красивые запросы:

Код:

SystemAdapter.SiteQueryer.NewHost = «karminavto.ru»;
// Шаг 1. Получаем сессию
SystemAdapter.SiteQueryer.Get( 1000, «/» );
// Шаг 2. Запрашиваем номер
sCurrentPath = «/parts/search»;
string sPostData = «frm[articul]=» + pPosition.sNumber;
sResponse = SystemAdapter.SiteQueryer.Post(5000, sCurrentPath, sPostData);


Но всегда... ВСЕГДА - возникают проблемы когда на сервере крутится IIS.
Иногда какими-то непонятными манипуляциями я это обхожу и потом - «ничего не трогать, ничего не менять!!!».

Вот такой запрос:
Код:
-------------
POST http://online.tmtr.ru/login.aspx HTTP/1.1
Host: online.tmtr.ru
Cookie:
Accept-Charset: windows-1251
Content-Type: application/x-www-form-urlencoded
Content-Length: 114

__VIEWSTATE=ghgho&__EVENTVALIDATION=p24d&tbLogin=RSA&tbPassword=UngD4Wr3vx&btSubmit=%D0%92%D0%BE%D0%B9%D1%82%D0%B8
-------------

Выдает: 500 Internal server error
Проблема явно в POST-данных, так как если убрать __VIEWSTATE=ghgho&__EVENTVALIDATION=p24d, то ошибки нет.
Content-Length посчитан правильно. Проверял через temper data.
Как уже говорил, такие проблемы с запросами к IIS случаются регулярно и пока до сих пор не понял из-за чего.
Кто-нибудь понимает что не так делаю?

PS. Запросы посылаются через проксю


Это ASP.NET (который не MVC). Как я понимаю, ViewState - это особенность самой технологии. Через это поле веб-форма передает свое состояние между запросами. Если ты что-то пишешь в поле, а на сервере нет ему соответствия, то тогда может быть сгенерирована ошибка. Странно, что она не отлавливается у них. В общем, ViewState я бы не трогал без надобности.

dave ★★★★★
()
Ответ на: комментарий от dave

Спасибо, на днях попробую брать значения прямо из формы

Atrill
() автор топика

========================
string sViewstate = Searchers.RegexpAnalyser.RegexpSearch( sResponse, «id=\»__VIEWSTATE\" value=\"(?<result>[^\«]+)» );
string sEventvelidation = Searchers.RegexpAnalyser.RegexpSearch(sResponse, «id=\»__EVENTVALIDATION\" value=\"(?<result>[^\«]+)»);

string sPostdata = «__VIEWSTATE=» + sViewstate +
«&__EVENTVALIDATION=» + sEventvelidation +
«&tbLogin=RSA&tbPassword=DUDUKE» +
«&btSubmit=%D0%92%D0%BE%D0%B9%D1%82%D0%B8»;
sPostdata = sPostdata.Replace(«+», «%20»);
sPostdata = sPostdata.Replace(«/», «%2F»);
sPostdata = sPostdata.Replace(" ", «%20»);

sResponse =
SystemAdapter.SiteQueryer.Post(1000, sPath, sPostdata);
MessageBox.Show(sResponse);
========================
сам запрос (переносы в POST-данных делает браузер - в оригинале нету):
========================
POST http://online.tmtr.ru/login.aspx HTTP/1.1
Host: online.tmtr.ru
Cookie:
Accept-Charset: windows-1251
Content-Type: application/x-www-form-urlencoded
Content-Length: 231

__VIEWSTATE=%2FwEPDwUKLTU0Mjc0MTI0N2RkxADr7%2Fbfq9%2FXg6NzHzi2%20gECB38=&__EVENTVALIDATION=%2FwEWBAKF7YK%2FCwLZzcHXAgK3jsrkBALoqK%2FYB9RsGSKGer33bp9Q9wkCa8JDp24d&tbLogin=RSA&tbPassword=DUDUKE&btSubmit=%D0%92%D0%BE%D0%B9%D1%82%D0%B8
========================

ответ тот же - 500.
Если нет идей, я попробую завтра в точности скопировать запрос firefox'а и отослать серверу. Авось заработает.

Atrill
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.