2009-08-26 22 views
7

Im tratando de enviar un formulario específico de forma programática, pero siempre me devuelve la página inicial. Debo estar haciendo algo mal o me falta algo aquí. Estoy enviando la cookie de sesión y algunos datos POST como viewState (que analizo de la solicitud inicial), y SessionID (este es el valor que cambio en el formulario para obtener datos de otros años). Pero en la segunda petición que Allways recuperar los datos de sesión 899, en lugar de la i solicitud: 875.enviando formulario programáticamente

Este es el código utilizado :, cualquier ayuda es muy apreciada

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

Esta es la solicitud RAW enviada por el script .NET.

la POST /EDMi/EDMList.aspx HTTP/1.1 Content-Type: application/x-www-form-urlencoded Accept: texto/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 Host: edmi.parliament.uk Cookie: ASP.NET_SessionId = k55fqarvx2oszp2wxhtrol45 Content-Length: 2431 esperar: 100 -continúe

__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

Esta es la solicitud RAW enviado por IE:

la POST /EDMi/EDMList.aspx HTTP/1.1 Accept: image/gif, imagen/jpeg, imagen /pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml + xml, application/vnd.ms-XpsDocument, application/x-ms-XBAP, application/x -ms-application, application/vnd.ms-exc EL, application/vnd.ms-powerpoint, aplicación/pdf, / Referer: http://edmi.parliament.uk/EDMi/EDMList.aspx Accept-Language: en-gb 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) Content-Type: application/x-www-form-urlencoded Aceptar-Codificación: gzip, deflate Host: edmi.parliament.uk Content-Length: 2431 Conexión: Keep-Alive Pragma: no-caché 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

El encabezamiento de IE parece tener una galleta extra (WT_FPC = id = 83.217.99.254-2364242496.30021299: lv = 1249572414567: ss = 1249572414567;) bruja appers para rastrear visitantes que utilizan cookies a través del complemento de cookies de WebTrends. Ambas solicitudes POST devuelven el código de estado HTTP 302 y lo redirigen a una solicitud GET que devuelve el estado 200.

¿Alguna idea?

+0

¿Ha intentado conectar Fiddler y diferir una solicitud genuina en comparación con su programado a mano? Debe haber una diferencia en alguna parte. – Pike65

+0

He estado tratando de descubrir esto con Fiddler. Actualizaré la publicación con los datos SIN PROCESAR de la solicitud. –

Respuesta

2

Lo he descifrado. Parece que al servidor .NET no le gusta que cambie el estado y la sesión al mismo tiempo. Funciona si cambio el "ddlStatus" de:

cadena Postdatum = "__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE =" + Viewstate + "& _MenuCtrl% 3AddlSession =" + sessionId + "& _MenuCtrl % 3A_GoTo.x = 57 & _MenuCtrl% 3A_GoTo.y = 14 & ddlStatus = 1 & ddlSortedBy = 1 ";

a esto:

cadena Postdatum = "__EVENTTARGET = & __EVENTARGUMENT = & __VIEWSTATE =" + Viewstate + "& _MenuCtrl% 3AddlSession =" + sessionId + "& _MenuCtrl% 3A_GoTo. x = 57 & _MenuCtrl% 3A_GoTo.y = 14 & ddlStatus = 0 & ddlSortedBy = 1 ";

Tendré que cambiar el ddlStatus en una segunda solicitud POST, y así sucesivamente para cada cambio en el formulario. .NET parece estar muy bien educado, solo puede tomar uno dulce a la vez.

Gracias por toda la ayuda :)

1

Quizás esto no esté relacionado con su problema, pero a veces, cuando raspa un sitio, el servidor remoto reconoce que quien está navegando es un script y bloquea algunas operaciones. Por lo general, lo soluciono configurando la propiedad UserAgent para la solicitud. Es una medida de seguridad deficiente, pero a menudo se usa en mi experiencia.

Here you can find some sample user agent strings.

+0

Lo he intentado con diferentes UserAgents sin éxito. Esto parece no ser el problema. –

1

Lo único que me pareció extraño en esa solicitud es el encabezado Expect. Apparently it's caused problems for people in the past. Para detener que se puede utilizar la siguiente línea:

Si ese es el problema probablemente vale la pena establecer que la propiedad volver a lo que era antes, ya que es una variable global y bien puede afectar a otras partes de su código.

+0

Pike65: Solo estaba investigando esto. He establecido oRequest.ServicePoint.Expect100Continue = false; Esto elimina la línea del encabezado, pero mi problema sigue siendo :( –

3

va a crear un nuevo CookieContainer cada vez. Intente utilizar el CookieContainer de la solicitud de la página de índice como el contenedor para el envío del formulario, debe contener la cookie adicional. Alternativamente, algo más que el formulario podría estar pasando la cookie extra. Compruebe cuándo se carga la página con IEinspector's HttpAnalyzer o Firefox's Firebug para asegurarse de que otros elementos del formulario, como las imágenes, no pasen la cookie.

Cuestiones relacionadas