Xpoint
   [напомнить пароль]

Получение информации от вебформы из консольного приложения

Метки: [без меток]
2010-01-02 00:29:01 [обр] Alexey V.Zelenin(0/8)[досье]

Задача:

- Имеется сайт, построенный на ASP.NET, на котором используются вебформы.
- Требуется из консольного приложения получить информацию с этого сайта и как-то её проанализировать.

Проблема:

При обращении к странице "напрямую" можно получить первоначальное состояние страницы. Однако при попытке сымитировать "Submit" приложение получает от сервера сообщение о 500-й ошибке. Судя по всему, проблема во ViewState - если его убрать из запроса, получаем отклик с неверными данными. Если передавать - случается ошибка.

Использовались два метода.

  1. Со статическим заранее заданным значением ViewState
string _url = "http://www2.miami-dadeclerk.com/payparking/parkingSearch.aspx";
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(_url);
string VIEWSTATE =
    "/wEPDwUKLTM4OTg0MjA4Ng8WHB4IS2V5bFByZXZlHghLZXlwTmV4dGUeA1RhZ2UeCk5vblJlbmV3YWxlHg5JbW1vYmlsaXphdGlvbmUeCFB5bXRUeXBlZR4KVGFnV2FybmluZ2UeCEtleXBQcmV2ZR4GVGFnRmVlZR4IS2V5bE5leHRlHgZibG5DaXRlHgRPcGVuZR4GQ2l0UmVmZR4FU3RhdGVlFgJmD2QWAgIDD2QWAgIDD2QWAgIDD2QWBGYPZBYEAgEPDxYCHgRUZXh0ZGRkAgMPZBYCAgEPZBYCZg9kFgICBw8QDxYGHg1EYXRhVGV4dEZpZWxkBQtkZXNjcmlwdGlvbh4ORGF0YVZhbHVlRmllbGQFCHN0YXRlX2NkHgtfIURhdGFCb3VuZGdkEBU+GUFybWVkIEZvcmNlcyB0aGUgQW1lcmljYXMTQXJtZWQgRm9yY2VzIEV1cm9wZQZBbGFza2EHQWxhYmFtYRRBcm1lZCBGb3JjZXMgUGFjaWZpYwhBcmthbnNhcw5BbWVyaWNhbiBTYW1vYQdBcml6b25hCkNhbGlmb3JuaWEIQ29sb3JhZG8LQ29ubmVjdGljdXQURGlzdHJpY3Qgb2YgQ29sdW1iaWEIRGVsYXdhcmUHRmxvcmlkYR5GZWRlcmF0ZWQgU3RhdGVzIG9mIE1pY3JvbmVzaWEHR2VvcmdpYQRHdWFtBkhhd2FpaQRJb3dhBUlkYWhvCElsbGlub2lzB0luZGlhbmEGS2Fuc2FzCEtlbnR1Y2t5CUxvdWlzaWFuYQ1NYXNzYWNodXNldHRzCE1hcnlsYW5kBU1haW5lEE1hcnNoYWxsIElzbGFuZHMITWljaGlnYW4JTWlubmVzb3RhCE1pc3NvdXJpGE5vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcwtNaXNzaXNzaXBwaQdNb250YW5hDk1leGljby1Db3VudHJ5Dk5vcnRoIENhcm9saW5hDE5vcnRoIERha290YQhOZWJyYXNrYQ1OZXcgSGFtcHNoaXJlCk5ldyBKZXJzZXkKTmV3IE1leGljbwZOZXZhZGEITmV3IFlvcmsET2hpbwhPa2xhaG9tYQZPcmVnb24MUGVubnN5bHZhbmlhC1B1ZXJ0byBSaWNvDFJob2RlIElzbGFuZA5Tb3V0aCBDYXJvbGluYQxTb3V0aCBEYWtvdGEJVGVubmVzc2VlBVRleGFzBFV0YWgIVmlyZ2luaWEUVmlyZ2luIElzbGFuZHMsIFUuUy4HVmVybW9udApXYXNoaW5ndG9uCVdpc2NvbnNpbg1XZXN0IFZpcmdpbmlhB1d5b21pbmcVPgJBQQJBRQJBSwJBTAJBUAJBUgJBUwJBWgJDQQJDTwJDVAJEQwJERQJGTAJGTQJHQQJHVQJISQJJQQJJRAJJTAJJTgJLUwJLWQJMQQJNQQJNRAJNRQJNSAJNSQJNTgJNTwJNUAJNUwJNVAJNWAJOQwJORAJORQJOSAJOSgJOTQJOVgJOWQJPSAJPSwJPUgJQQQJQUgJSSQJTQwJTRAJUTgJUWAJVVAJWQQJWSQJWVAJXQQJXSQJXVgJXWRQrAz5nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2RkAgIPZBYeAgEPFgIeB1Zpc2libGVnFgJmD2QWBgIBDw8WAh8OBQg0MDA4NTA1MGRkAgMPDxYCHw4FCFBheSBIZWxwZGQCBQ9kFgICAw9kFgICAQ8PFgIfDgWnBDx0YWJsZSBhbGlnbj0nY2VudGVyJz48dHI+PHRkIGNvbHNwYW49JzInPjxiciAvPjwvdGQ+PC90cj48dHI+PHRkIGNvbHNwYW49JzInPjxzdHJvbmc+SW50ZXJuZXQgUGF5bWVudCBJbmZvcm1hdGlvbiBmb3IgUGFya2luZyBDaXRhdGlvbnM8L3N0cm9uZz48L3RkPjwvdHI+PHRyPjx0ZCBjb2xzcGFuPScyJz48YnIgLz48L3RkPjwvdHI+PHRyPjx0ZCAgY29sc3Bhbj0nMicgc3R5bGU9J3RleHQtYWxpZ246IGp1c3RpZnknPiZuYnNwO0FsbCBwYXltZW50cyB3aWxsIGJlIHByb2Nlc3NlZCB0aGUgbmV4dCBidXNpbmVzcyBkYXkuICBQbGVhc2UgYmUgYXdhcmUgdGhhdCB5b3VyIGNyZWRpdCBjYXJkIHdpbGwgYmUgYmlsbGVkIGZvciB0aGUgPHN0cm9uZz5Ub3RhbCBBbW91bnQgRHVlPC9zdHJvbmc+LCB3aGljaCByZWZsZWN0cyA8c3Ryb25nPmFsbDwvc3Ryb25nPiBvdXRzdGFuZGluZyBjaXRhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgTGljZW5zZSBQbGF0ZSBudW1iZXIuPC90ZD48L3RyPjx0cj48dGQgY29sc3Bhbj0nMic+PGJyIC8+PC90ZD48L3RyPjwvdGFibGU+ZGQCBA8WAh8SaBYCAgEPZBYCAgEPDxYCHw4FCDQwMDg1MDUwZGQCBQ9kFgQCAQ9kFgICAQ8PFgQfDgUGMjU4NEtLHxJnZGQCAg9kFgICAQ8PFgIfEmdkZAIGD2QWAgIBD2QWAgIBDw8WAh8OBQJGTGRkAgcPDxYCHw4FEDA3LzMwLzIwMDkgMTI6MzlkZAIJDw8WAh8OBQYkMTguMDBkZAIKDw8WAh8OBQowOC8yOS8yMDA5ZGQCCw8PFgIfDgUGJDQ1LjAwZGQCDA8PFgIfDgUET1BFTmRkAg0PDxYCHw4FEDEyMDAgQ09MTElOUyBMT1RkZAIODw8WAh8OBShNSUFNSSBCRUFDSCAgICAgICAoTUIgLSBQQVJLSU5HIEVORk9SQ0UpZGQCDw8PFgIfDgUhUEFSS0lORyBJTiBFWENFU1MgT0YgQUxMT1dFRCBUSU1FZGQCEw8PFgIfDgUHVU5LTk9XTmRkAhQPDxYCHw4FBU1PUEVEZGQCFQ8PFgIfDgVWUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxBQ0tkZBgDBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAQUpY3RsMDAkQ29udGVudFBsYWNlSG9sZGVyMSR0Y1BhcmtpbmdTZWFyY2gFKmN0bDAwJENvbnRlbnRQbGFjZUhvbGRlcjEkbXZDaXRhdGlvblNlYXJjaA8PZGZkBSljdGwwMCRDb250ZW50UGxhY2VIb2xkZXIxJHRjUGFya2luZ1NlYXJjaA8PZGZkYiDrKweKKcwW4c5+L/ZDT+EGtsk=";
string EVENTVALIDATION = 
    "/wEWRQL8+528DgKr2uXHBQKJ2vb4DgKj85OrAQKSpaPuBwKmuOumCQKmuNumCQKmuPOmCQKmuPemCQKmuKemCQKmuK+mCQKmuJOmCQKmuM+nCQKkuOumCQKkuOOmCQKkuJemCQKluNOmCQKluNumCQKjuPemCQKjuPumCQKguOumCQKguJumCQKRuIumCQKeuOumCQKeuNemCQKeuPemCQKeuP+mCQKcuJOmCQKcuMunCQKduOumCQKauOumCQKauNemCQKauNumCQKauIemCQKauIumCQKauP+mCQKauOOmCQKauKemCQKauJOmCQKauJemCQKauMenCQKbuNOmCQKbuNemCQKbuNumCQKbuIemCQKbuI+mCQKbuPumCQKbuJ+mCQKbuMunCQKYuIemCQKYuPOmCQKYuK+mCQKJuOumCQKJuK+mCQKXuIumCQKUuNOmCQKUuNemCQKVuP+mCQKVuMenCQKSuJemCQKTuOumCQKTuIumCQKTuJemCQKQuOumCQKQuIumCQKQuJ+mCQKQuMunCQKy/vLHBQLq9sCfBDa2VKPrxlFOblxzafKY11nYH7OP";

StringBuilder req = new StringBuilder();
req.AppendFormat("&{0}={1}", "__VIEWSTATE", System.Web.HttpUtility.UrlEncode(VIEWSTATE));
req.AppendFormat("&{0}={1}", "__EVENTVALIDATION", EVENTVALIDATION);
req.AppendFormat("&{0}={1}", "__EVENTARGUMENT", "");
req.AppendFormat("&{0}={1}", "__EVENTTARGET", "");
req.AppendFormat("&{0}={1}", "ctl00_ContentPlaceHolder1_tcParkingSearch_ClientState", 
    System.Web.HttpUtility.UrlEncode("{\"ActiveTabIndex\":0,\"TabState\":[true,true]}"));
req.AppendFormat("&{0}={1}", "ctl00$ContentPlaceHolder1$tcParkingSearch$tp_CitationSearch$txtcitn", "");
req.AppendFormat("&{0}={1}", "ctl00$ContentPlaceHolder1$tcParkingSearch$tp_TagSearch$txtTag", "725");
req.AppendFormat("&{0}={1}", "ctl00$ContentPlaceHolder1$tcParkingSearch$tp_TagSearch$DropDownState", 
    "FL");
req.AppendFormat("&{0}={1}", "ctl00$ContentPlaceHolder1$tcParkingSearch$tp_TagSearch$btnSubmit_TagSearch", 
    "Submit");

byte[] formData = Encoding.UTF8.GetBytes(req.ToString());

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = formData.Length;
request.Method = "POST";
request.Credentials = CredentialCache.DefaultCredentials; // for win authentification, if require
Stream requestStream = request.GetRequestStream();
requestStream.Write(formData, 0, formData.Length);
WebResponse webResponse = request.GetResponse();
StreamReader receiveReader = new StreamReader(webResponse.GetResponseStream());
var response = receiveReader.ReadToEnd();
receiveReader.Close();
webResponse.Close();
  1. С ViewState, полученным с первоначальной страницы, как было описано вот в этом топике: http://www.gotdotnet.ru/blogs/nisus/4322/21417

Результаты одинаковые и весьма плачевные.

Есть ли у уважаемых Гуру какие-то идеи?

спустя 11 часов [обр] Василий Свиридов(47/175)[досье]
Во ViewState лежат данные, которые описывают состояние всех контролов страницы до постбэк. Так что вам наверное сначала нужно получить форму в её оригинальном состоянии, сохранить ViewState в переменную, и сделать Submit, с использованием сохранённого ViewState.
спустя 13 минут [обр] Alexey V.Zelenin(0/8)[досье]
Это был как раз второй опробованный мною вариант - я даже просто тупо собирал все контролы с формы и отсылал их "один-в-один", только проведя urlEncoding для ViewState. Результат тот же.
спустя 10 часов [обр] Василий Свиридов(47/175)[досье]
Alexey V.Zelenin[досье] Так а почему просто не взять ViewState родной, сгенерированный прямо перед запросом? На нём же не обязательно будут только контролы. (Я в него периодически и другие всякие вещи кладу в своих проектах). Есть утилитка, которая показывает что в нём лежит (если не зашифровано). Посмотрите тоже, может там какая-то специфика.
спустя 12 часов [обр] Alexey V.Zelenin(0/8)[досье]
Василий Свиридов[досье] Ну так я с самого начала пробовал вьюстейт "родной" использовать - получал снова и снова ошибку. Судя по всему, проблема разрешилась путём использования юникода при вызове System.Web.HttpUtility.UrlEncodeUnicode(ViewState) вместо оригинального System.Web.HttpUtility.UrlEncode(ViewState)
спустя 1 день 20 часов [обр] Василий Свиридов(47/175)[досье]
Мда, заморочка... Будем знать :)
Powered by POEM™ Engine Copyright © 2002-2005