2009-08-26 11 views
7

En essayant de soumettre un formulaire spécifique par programme, mais je récupère toujours la page initiale. Je dois faire quelque chose de mal ou de manquer quelque chose ici. J'envoie le cookie de session et certaines données POST comme viewState (que j'analyse à partir de la demande initiale), et SessionID (c'est la valeur que je modifie dans le formulaire et les données d'autres années). Mais dans la seconde demande, je reçois AllWays données pour la session 899, au lieu de celui que je demande: 875.Soumettre un formulaire par programme

Voici le code utilisé :, toute aide est grandement aprécié

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; 
} 

Ceci est la demande RAW envoyée par le script .NET.

POST /EDMi/EDMList.aspx HTTP/1.1 Content-Type: application/x-www-form-urlencoded Accepter: text/html, application/xhtml + xml, application/xml; q = 0,9, /; q = 0,8 Referer: http://edmi.parliament.uk/EDMi/EDMList.aspx User-Agent: .NET Framework client hôte: edmi.parliament.uk Cookie: ASP.NET_SessionId = k55fqarvx2oszp2wxhtrol45 Content-Length: 2431 Expect: 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.y = 14 & & ddlStatus = 1 ddlSortedBy = 1

Ceci est la demande envoyée par RAW IE:

POST /EDMi/EDMList.aspx HTTP/1.1 Accept: image/gif image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, l'application /xaml + xml, l'application /vnd.ms-XpsDocument, application/x-ms-XBAP, application/x -ms-application, application/vnd.ms-exc el, application/vnd.ms-powerpoint, l'application /msword, / Referer: http://edmi.parliament.uk/EDMi/EDMList.aspx Accept-Language: fr-fr User-Agent: Mozilla/4.0 (compatible; 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) Type de contenu: application/x-www-form-urlencoded Accept-Codage: gzip, dégonfler Hôte: edmi.parliament.uk Longueur de contenu: 2431 Connexion: Keep-Alive Pragma: no-cache Cookie: 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.x = 37 & _MenuCtrl% 3A_GoTo.y = 12

L'en-tête IE semble avoir un cookie supplémentaire (WT_FPC = id = 83.217.99.254-2364242496.30021299: vl = 1249572414567: ss = 1249572414567;) sorcière appers pour suivre les visiteurs qui utilisent des cookies via le plug-in Cookie WebTrends. Les deux requêtes POST renvoient le code d'état HTTP 302 et redirigent vers une requête GET qui renvoie l'état 200.

Des idées?

+0

Avez-vous essayé de brancher Fiddler et de différer une requête réelle par rapport à celle créée par programmation? Il doit y avoir une différence quelque part. – Pike65

+0

J'ai essayé de comprendre cela avec Fiddler. Je mettrai à jour le poste avec les données RAW de la demande. –

Répondre

2

Je l'ai craqué. Il semble que le serveur .NET n'aime pas que je change le statut et la session en même temps. Il fonctionne si je change le "ddlStatus" de:

chaîne postdata = "__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE =" + VIEWSTATE + "& _MenuCtrl% 3AddlSession =" + sessionId + "& _MenuCtrl % 3A_GoTo.x = 57 & _MenuCtrl% 3A_GoTo.y = 14 & ddlStatus = 1 & ddlSortedBy = 1 ";

à ceci:

chaîne postdata = "__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE =" + VIEWSTATE + "& _MenuCtrl% 3AddlSession =" + sessionId + "& _MenuCtrl% 3A_GoTo. x = 57 & _MenuCtrl% 3A_GoTo.y = 14 & ddlStatus = 0 & ddlSortedBy = 1 ";

Je devrai changer le ddlStatus dans une deuxième requête POST, et ainsi de suite pour chaque changement dans le formulaire. .NET semble être très bien éduqué, il ne peut prendre qu'un doux à la fois.

Merci pour toute l'aide :)

1

Peut-être que cela n'est pas lié à votre problème, mais parfois, lorsque vous grattez un site, le serveur distant reconnaît que celui qui navigue est un script et bloque certaines opérations. Je contourne généralement ce problème en définissant la propriété UserAgent à la demande. C'est une mesure de sécurité médiocre, mais souvent utilisée dans mon expérience.

Here you can find some sample user agent strings.

+0

J'ai essayé avec différents UserAgents sans succès. Cela ne semble pas être le problème. –

1

La seule chose qui m'a frappé dans cette demande est l'en-tête Expect. Apparently it's caused problems for people in the past. Pour arrêter que vous pouvez utiliser la ligne suivante:

Si tel est le problème, il est probablement utile de mettre cette propriété à ce qu'il était avant, car il est une variable globale et pourrait bien affecter d'autres parties de votre code.

+0

Pike65: Je regardais juste ça. J'ai défini oRequest.ServicePoint.Expect100Continue = false; Cela supprime la ligne de l'en-tête, mais mon problème reste :( –

3

Vous créez une nouvelle CookieContainer à chaque fois. Essayez d'utiliser le CookieContainer de la demande de page d'index en tant que conteneur pour l'envoi du formulaire, il doit contenir le cookie supplémentaire. Alternativement, quelque chose d'autre que le formulaire pourrait passer le cookie supplémentaire. Vérifiez le chargement de la page à l'aide du HttpAnalyzer de IEinspector ou du Firebug de Firefox pour vous assurer que les autres éléments de formulaire, tels que les images, ne transmettent pas le cookie.

Questions connexes