2009-08-26 4 views
7

Im пытается отправить конкретную форму программно, но я всегда получаю исходную страницу назад. Должно быть, я что-то делаю неправильно или что-то не хватает. Im, отправляющий файл cookie сеанса и некоторые данные POST, такие как viewState (которые я анализирую из первоначального запроса) и SessionID (это значение, которое я изменяю в форме с данными из других лет). Но во втором запросе я всегда сразу получить данные для сессии 899, а не тот, я прошу: 875.Форма представления программно

Вот код используется :, любая помощь очень apreciated

retrieveEdmIndexForSession (875);

protected string retrieveEdmIndexForSession(int sessionId) { 

    CookieContainer cookies; 
    HttpWebRequest oRequest; 
    HttpWebResponse oResponse; 
    Stream sw; 
    StreamReader sr; 
    string pageData; 
string PathRemote = @"http://edmi.parliament.uk/EDMi/EDMList.aspx"; 


    /* 
    * download the index page so we can get Cookies and ViewState from it. 
    */ 
    oRequest = (HttpWebRequest)WebRequest.Create(PathRemote); 
    oRequest.Method = "GET"; 
    oRequest.AllowAutoRedirect = true; 
    oRequest.CookieContainer = new CookieContainer(); 
    oRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    oRequest.Referer = "http://edmi.parliament.uk/EDMi/EDMList.aspx"; 


    oResponse =(HttpWebResponse) oRequest.GetResponse(); 
    sr = new StreamReader(oResponse.GetResponseStream()); 

    pageData = sr.ReadToEnd(); 

    /* 
    * extract view state from pageData. 
    */ 
    string viewState = this.ExtractViewState(pageData); 


    /* 
    * lets submit the form with the parameters we want 
    */ 
    oRequest = (HttpWebRequest)WebRequest.Create(PathRemote); 
    oRequest.Method = "POST"; 
    oRequest.AllowAutoRedirect = true; 
    oRequest.ContentType = "application/x-www-form-urlencoded"; 
    oRequest.CookieContainer = new CookieContainer(); 
    oRequest.CookieContainer.Add(oResponse.Cookies); 
    oRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
    oRequest.Referer = "http://edmi.parliament.uk/EDMi/EDMList.aspx"; 

    string postdata = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=" + viewState + "&_MenuCtrl%3AddlSession=" + sessionId + "&_MenuCtrl%3A_GoTo.x=57&_MenuCtrl%3A_GoTo.y=14&ddlStatus=1&ddlSortedBy=1"; 
    byte[] buffer = Encoding.UTF8.GetBytes(postdata); 
    oRequest.ContentLength = buffer.Length; 

    /* 
    * Send post data into request stream first 
    */ 
    sw = oRequest.GetRequestStream(); 
    sw.Write(buffer, 0, buffer.Length); 
    sw.Flush(); 
    sw.Close(); 

    /* 
    * Connect, send and get response 
    */ 
    oResponse = (HttpWebResponse)oRequest.GetResponse(); 
    sr = new StreamReader(oResponse.GetResponseStream()); 

    //OnLogUpdated(1, "\r\nStatus Code: " + oResponse.StatusCode); 
    //OnLogUpdated(1, "\r\nServer: " + oResponse.Server); 

    pageData = sr.ReadToEnd(); 
    string result = getSessionId(pageData); 
    //OnLogUpdated(1, "\r\nRestuls: [" + result + "]"); 
    //OnLogUpdated(1, "\r\nPage: [" + pageData + "]"); 


    return pageData; 


} 



private string ExtractViewState(string str) 
{ 
    string viewState = ""; 
    string pattern = "(?<=__VIEWSTATE\" value=\")(?<val>.*?)(?=\")"; 

    Match match = Regex.Match(str, pattern); 

    if (match.Success) 
    { 
     viewState = match.Groups["val"].Value; 
     viewState = HttpUtility.UrlEncodeUnicode(viewState); 

    } 

    return viewState; 
} 

protected string getSessionId(string str) 
{ 
    string sessionId = string.Empty; 

    str = str.Trim(); 

    string pattern = @"&SESSION=([^']+)'"; 

    Match match = Regex.Match(str, pattern, RegexOptions.IgnoreCase); 
    if (match.Success) 
    { 
     sessionId = match.Groups[1].ToString(); ; 

    } 

    return sessionId; 
} 

Это запрос RAW, отправляемый скриптом .NET.

POST /EDMi/EDMList.aspx HTTP/1.1 Content-Type: применение/х-WWW-форм-urlencoded Accept: текст/HTML, приложение/XHTML + XML, приложения/XML; д = 0,9, /; д = 0,8 Referer: http://edmi.parliament.uk/EDMi/EDMList.aspx User-Agent: .NET Framework Клиент Хост: edmi.parliament.uk Cookie: ASP.NET_SessionId = k55fqarvx2oszp2wxhtrol45 Content-Length: 2431 Ожидать: 100 -continue

__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE = dDwxMDgyNzIxNDQ2O3Q8O2w8aTwzPjs% 2bO2w8dDw7bDxpPDE% 2bO2k8Mz47aTw1PjtpPDExPjs% 2bO2w8dDw7bDxpPDEzPjtpPDE3Pjs% 2bO2w8dDx0PHA8cDxsPERhdGFWYWx1ZUZpZWxkO0RhdGFUZXh0RmllbGQ7PjtsPFNFU1NJT05JRDtJVEVNX1ZBTFVFOz4% 2bOz47dDxpPDIwPjtAPDA4LTA5OzA3LTA4OzA2LTA3OzA1LTA2OzA0LTA1OzAzLTA0OzAyLTAzOzAxLTAyOzAwLTAxOzk5LTAwOzk4LTk5Ozk3LTk4Ozk2LTk3Ozk1LTk2Ozk0LTk1OzkzLTk0OzkyLTkzOzkxLTkyOzkwLTkxOzg5LTkwOz47QDw4OTk7ODkxOzg4NTs4NzU7ODczOzY4Mjs2ODE7NjgwOzY3OTs3MDM7NzAyOzcwMTs3MDA7Njk5OzY5ODs2OTc7Njk2OzY5NTs2OTQ7NjkzOz4% 2bOz47Oz47dDxwPGw8VGV4dDs% 2bO2w8TGlzdCBPZiBFYXJseSBEYXkgTW90aW9uczs% 2bPjs7Pjs% 2bPjt0PDtsPGk8MT47aTwzPjs% 2bO2w8dDx0PDs7bDxpPDA% 2bOz4% 2bOzs% 2bO3Q8dDw7O2w8aTwwPjs% 2bPjs7Pjs% 2bPjt0PDtsPGk8MT47aTwzPjs% 2bO2w8dDw7bDxpPDE% 2bO2k8Mz47aTw1PjtpPDc% 2bOz47bDx0PHA8cDxsPENvbW1hbmRBcmd1bWVudDtDc3NDbGFzcztFbmFibGVkO18hU0I7PjtsPDA7UGFnZUZpcnN0RGlzYWJsZWQ7b zxmPjtpPDI% 2bOz4% 2bOz47Oz47dDxwPHA8bDxDb21tYW5kQXJndW1lbnQ7Q3NzQ2xhc3M7RW5hYmxlZDtfIVNCOz47bDwtMTtQYWdlUHJldkRpc2FibGVkO288Zj47aTwyPjs% 2bPjs% 2bOzs% 2bO3Q8cDxwPGw8Q29tbWFuZEFyZ3VtZW50O0Nzc0NsYXNzO18hU0I7PjtsPDE7UGFnZU5leHRFbmFibGVkO2k8Mj47Pj47Pjs7Pjt0PHA8cDxsPENvbW1hbmRBcmd1bWVudDtDc3NDbGFzcztfIVNCOz47bDw0MjtQYWdlTGFzdEVuYWJsZWQ7aTwyPjs% 2bPjs% 2bOzs% 2bOz4% 2bO3Q8O2w8aTwxPjtpPDM% 2bO2k8NT47aTw3Pjs% 2bO2w8dDxwPHA8bDxUZXh0Oz47bDwyMTA5Oz4% 2bOz47Oz47dDxwPHA8bDxUZXh0Oz47bDxFRE1zIGFuZCBBbWVuZG1lbnRzOz4% 2bOz47Oz47dDxwPHA8bDxUZXh0Oz47bDwxOz4% 2bOz47Oz47dDxwPHA8bDxUZXh0Oz47bDw1MDs% 2bPjs% 2bOzs% 2bOz4% 2bOz4% 2bO3Q8O2w8aTwxPjtpPDM% 2bOz47bDx0PDtsPGk8MT47aTwzPjtpPDU% 2bO2k8Nz47PjtsPHQ8cDxwPGw8Q29tbWFuZEFyZ3VtZW50O0Nzc0NsYXNzO0VuYWJsZWQ7XyFTQjs% 2bO2w8MDtQYWdlRmlyc3REaXNhYmxlZDtvPGY% 2bO2k8Mj47Pj47Pjs7Pjt0PHA8cDxsPENvbW1hbmRBcmd1bWVudDtDc3NDbGFzcztFbmFibGVkO18hU0I7PjtsPC0xO1BhZ2VQcmV2RGlzYWJsZWQ7bzxmPjtpPDI% 2bOz4% 2bOz47Oz47dDxwPHA8bDxDb21tYW5kQXJndW1lbnQ7Q3NzQ2xhc3M7XyFTQjs% 2bO2w8MTtQYWdlTmV4dEVuYWJsZWQ7aTwyPjs% 2 bPjs% 2bOzs% 2bO3Q8cDxwPGw8Q29tbWFuZEFyZ3VtZW50O0Nzc0NsYXNzO18hU0I7PjtsPDQyO1BhZ2VMYXN0RW5hYmxlZDtpPDI% 2bOz4% 2bOz47Oz47Pj47dDxwPHA8bDxWaXNpYmxlOz47bDxvPGY% 2bOz4% 2bOz47bDxpPDE% 2bO2k8Mz47aTw1PjtpPDc% 2bOz47bDx0PHA8cDxsPFRleHQ7PjtsPDIxMDk7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEVETXMgYW5kIEFtZW5kbWVudHM7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDE7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDUwOz4% 2bOz47Oz47Pj47Pj47Pj47Pj47bDxfTWVudUN0cmw6X0dvVG87Pj5NHcFbPBNzNuwxs7sYLdUE2omkjw% 3d% 3d & _MenuCtrl% 3AddlSession = 875 & _MenuCtrl% 3A_GoTo.x = 57 & _MenuCtrl% 3A_GoTo.у = 14 & ddlStatus = 1 & ddlSortedBy = 1

Это RAW-запрос, отправленный IE:

POST /EDMi/EDMList.aspx HTTP/1.1 Accept: изображение/GIF, изображение/JPEG, изображения/pjpeg, изображение/pjpeg, применения/х-ударноволновая-вспышка, приложения/XAML + XML, приложения/vnd.ms-xpsdocument, применения/X-MS-XBAP, применения/х -ms-application, application/vnd.ms-exc эль, применение/vnd.ms-POWERPOINT, применение/MSWord, / Referer: http://edmi.parliament.uk/EDMi/EDMList.aspx Accept-Language: ан-гб User-Agent: Mozilla /4.0 (совместимый; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.1; .NET CLR 3.0.04506.648; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: edmi.parliament.uk Content-Length: 2431 Connection: Keep-Alive Pragma: no-cache Печенье: WT_FPC = id = 83.217.99.254-2364242496.30021299: lv = 1249572414567: ss = 1249572414567; ASP.NET_SessionId = vwxgo4rlex1j5m55l0bivrqo

__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE = dDwxMDgyNzIxNDQ2O3Q8O2w8aTwzPjs% 2BO2w8dDw7bDxpPDE% 2BO2k8Mz47aTw1PjtpPDExPjs% 2BO2w8dDw7bDxpPDEzPjtpPDE3Pjs% 2BO2w8dDx0PHA8cDxsPERhdGFWYWx1ZUZpZWxkO0RhdGFUZXh0RmllbGQ7PjtsPFNFU1NJT05JRDtJVEVNX1ZBTFVFOz4% 2BOz47dDxpPDIwPjtAPDA4LTA5OzA3LTA4OzA2LTA3OzA1LTA2OzA0LTA1OzAzLTA0OzAyLTAzOzAxLTAyOzAwLTAxOzk5LTAwOzk4LTk5Ozk3LTk4Ozk2LTk3Ozk1LTk2Ozk0LTk1OzkzLTk0OzkyLTkzOzkxLTkyOzkwLTkxOzg5LTkwOz47QDw4OTk7ODkxOzg4NTs4NzU7ODczOzY4Mjs2ODE7NjgwOzY3OTs3MDM7NzAyOzcwMTs3MDA7Njk5OzY5ODs2OTc7Njk2OzY5NTs2OTQ7NjkzOz4% 2BOz47Oz47dDxwPGw8VGV4dDs% 2BO2w8TGlzdCBPZiBFYXJseSBEYXkgTW90aW9uczs% 2BPjs7Pjs% 2BPjt0PDtsPGk8MT47aTwzPjs% 2BO2w8dDx0PDs7bDxpPDA% 2BOz4% 2BOzs% 2BO3Q8dDw7O2w8aTwwPjs% 2BPjs7Pjs% 2BPjt0PDtsPGk8MT47aTwzPjs% 2Bo 2w8dDw7bDxpPDE% 2BO2k8Mz47aTw1PjtpPDc% 2BOz47bDx0PHA8cDxsPENvbW1hbmRBcmd1bWVudDtDc3NDbGFzcztFbmFibGVkO18hU0I7PjtsPDA7UGFnZUZpcnN0RGlzYWJsZWQ7bzxmPjtpPDI% 2BOz4% 2BOz47Oz47dDxwPHA8bDxDb21tYW5kQXJndW1lbnQ7Q3NzQ2xhc3M7RW5hYmxlZDtfIVNCOz47bDwtMTtQYWdlUHJldkRpc2FibGVkO288Zj47aTwyPjs% 2BPjs% 2BOzs% 2BO3Q8cDxwPGw8Q29tbWFuZEFyZ3VtZW50O0Nzc0NsYXNzO18hU0I7PjtsPDE7UGFnZU5leHRFbmFibGVkO2k8Mj47Pj47Pjs7Pjt0PHA8cDxsPENvbW1hbmRBcmd1bWVudDtDc3NDbGFzcztfIVNCOz47bDw0MjtQYWdlTGFzdEVuYWJsZWQ7aTwyPjs% 2BPjs% 2BOzs% 2BOz4% 2BO3Q8O2w8aTwxPjtpPDM% 2BO2k8NT47aTw3Pjs% 2BO2w8dDxwPHA8bDxUZXh0Oz47bDwyMTA5Oz4% 2BOz47Oz47dDxwPHA8bDxUZXh0Oz47bDxFRE1zIGFuZCBBbWVuZG1lbnRzOz4% 2BOz47Oz47dDxwPHA8bDxUZXh0Oz47bDwxOz4% 2BOz47Oz47dDxwPHA8bDxUZXh0Oz47bDw1MDs% 2BPjs% 2BOzs% 2BOz4% 2BOz4% 2BO3Q8O2w8aTwxPjtpPDM% 2BOz47bDx0PDtsPGk8MT47aTwzPjtpPDU% 2BO2k8Nz47PjtsPHQ8cDxwPGw8Q29tbWFuZEFyZ3VtZW50O0Nzc0NsYXNzO0VuYWJsZWQ7XyFTQjs% 2BO2w8MDtQYWdlRmlyc3REaXNhYmxlZDtvPGY% 2BO2k8Mj47Pj47Pjs7Pjt0PHA8cDxsPENvbW1hbmRBcmd1bWVudDtDc3NDbGFzcztFbmFibGVkO18hU0I7PjtsPC0xO1B hZ2VQcmV2RGlzYWJsZWQ7bzxmPjtpPDI% 2BOz4% 2BOz47Oz47dDxwPHA8bDxDb21tYW5kQXJndW1lbnQ7Q3NzQ2xhc3M7XyFTQjs% 2BO2w8MTtQYWdlTmV4dEVuYWJsZWQ7aTwyPjs% 2BPjs% 2BOzs% 2BO3Q8cDxwPGw8Q29tbWFuZEFyZ3VtZW50O0Nzc0NsYXNzO18hU0I7PjtsPDQyO1BhZ2VMYXN0RW5hYmxlZDtpPDI% 2BOz4% 2BOz47Oz47Pj47dDxwPHA8bDxWaXNpYmxlOz47bDxvPGY% 2BOz4% 2BOz47bDxpPDE% 2BO2k8Mz47aTw1PjtpPDc% 2BOz47bDx0PHA8cDxsPFRleHQ7PjtsPDIxMDk7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPEVETXMgYW5kIEFtZW5kbWVudHM7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDE7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPDUwOz4% 2BOz47Oz47Pj47Pj47Pj47Pj47bDxfTWVudUN0cmw6X0dvVG87Pj5NHcFbPBNzNuwxs7sYLdUE2omkjw% 3D% 3D & _MenuCtrl% 3AddlSession = 885 & ddlStatus = 0 & ddlSortedBy = 1 & _MenuCtrl% 3A_GoTo.х = 37 & _MenuCtrl% 3A_GoTo.y = 12

IE заголовок, кажется, есть дополнительные куки (WT_FPC = ID = 83.217.99.254-2364242496.30021299: лв = 1249572414567: сс = 1249572414567;) ведьма appers отслеживать посетителей с помощью файлов cookie через подключаемый модуль WebTrends Cookie. Оба запроса POST Возвращают код состояния HTTP 302 и перенаправляют запрос GET, который возвращает статус 200.

Любые идеи?

+0

Вы пытались подключить Fiddler и отличить подлинный запрос по сравнению с вашим программно созданным? Где-то должна быть разница. – Pike65

+0

Я пытаюсь понять это с помощью Скрипача. Я обновляю сообщение с данными RAW запроса. –

ответ

2

Я расколол его. Кажется, что сервер .NET не любит меня менять статус и сеанс одновременно. Это работает, если я изменить "ddlStatus" от:

строка PostData = "__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE =" + VIEWSTATE + "& _MenuCtrl% 3AddlSession =" + SESSIONID + "& _MenuCtrl % 3A_GoTo.x = 57 & _MenuCtrl% 3A_GoTo.y = 14 & ddlStatus = 1 & ddlSortedBy = 1 ";

к этому:

строка PostData = "__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE =" + VIEWSTATE + "& _MenuCtrl% 3AddlSession =" + SESSIONID + "& _MenuCtrl% 3A_GoTo. x = 57 & _MenuCtrl% 3A_GoTo.y = 14 & ddlStatus = 0 & ddlSortedBy = 1 ";

Мне нужно будет изменить ddlStatus во втором POST-запросе и так далее для каждого изменения формы. .NET, кажется, очень хорошо образован, он может принимать только один сладкий за раз.

Спасибо за помощь :)

1

Возможно, это не связано с вашей проблемой, но иногда, когда вы очищаете сайт, удаленный сервер распознает, что тот, кто просматривает сценарий, блокирует некоторые операции. Я обычно обходим это путем установки свойства UserAgent в запрос. Это плохая мера безопасности, но часто используется в моем опыте.

Here you can find some sample user agent strings.

+0

Я пробовал с разными пользователями без успеха. Это, похоже, не проблема. –

1

Единственное, что поразило меня как нечетное в этом запросе, это заголовок Expect. Apparently it's caused problems for people in the past. Для того, чтобы остановить, что вы можете использовать следующую строку:

Если это проблема, это, вероятно, стоит установка этого имущества обратно то, что было раньше, так как это глобальная переменная и вполне может повлиять на другие части вашего кода.

+0

Pike65: Я просто изучал это. Я установил oRequest.ServicePoint.Expect100Continue = false; Это удаляет строку из заголовка, но моя проблема остается :( –

3

Вы создаете новый CookieContainer каждый раз. Попробуйте использовать CookieContainer запроса индексной страницы в качестве контейнера для отправки формы, он должен содержать дополнительный файл cookie. Альтернативно, что-то, кроме формы, может передавать дополнительный файл cookie. Проверьте, когда страница загружается с помощью HttpAnalyzer или IE3 в Firefox Firebug, чтобы убедиться, что другие элементы формы, такие как изображения, не передают файл cookie.