2010-11-11 16 views
9

Tengo una aplicación de winforms en la que he estado trabajando que ejecuta múltiples pruebas en cuentas de consumidores. Las pruebas requieren un inicio de sesión único para ejecutarse.C# WebRequest usando cookies

string paramaters = "authmethod=on&chkRememberMe=on&login-form-type=pwd&password=" + pw.Text + "&userid=" + uid.Text + "&username=" + uid.Text; 
     string strResponse; 
     HttpWebRequest requestLogin = (HttpWebRequest)WebRequest.Create("https://www.url.com/login.form"); 
     requestLogin.Method = "POST"; 
     requestLogin.CookieContainer = cookieJar; 
     requestLogin.ContentType = "application/x-www-form-urlencoded"; 

     requestLogin.ContentLength = paramaters.Length; 
     StreamWriter stOut = new StreamWriter(requestLogin.GetRequestStream(), System.Text.Encoding.ASCII); 
     stOut.Write(paramaters); 
     stOut.Close(); 

     StreamReader stIn = new StreamReader(requestLogin.GetResponse().GetResponseStream()); 
     strResponse = stIn.ReadToEnd(); 
     stIn.Close(); 

Este script funciona para el inicio de sesión muy bien, el problema es cuando se necesita para ejecutar efectivamente las pruebas que necesito para devolver todos los resultados en una cadena (resultados HTML).

private string runTestRequest(Uri url, string parameters) 
    { 
     string testResults = string.Empty; 
     HttpWebRequest runTest = (HttpWebRequest)WebRequest.Create(url); 
     runTest.CookieContainer = cookieJar; 
     runTest.Method = "POST"; 
     runTest.ContentType = "application/x-www-form-urlencoded"; 
     StreamWriter stOut = new StreamWriter(runTest.GetRequestStream(), System.Text.Encoding.ASCII); 
     stOut.Write(parameters); 
     stOut.Close(); 
     StreamReader stIn = new StreamReader(runTest.GetResponse().GetResponseStream()); 
     testResults = stIn.ReadToEnd(); 
     stIn.Close(); 
     return testResults; 
    } 

Pero va y trata de iniciar sesión. ¿Cómo puedo usar la Cookie de la solicitud de inicio de sesión anterior con esta + muchas otras solicitudes web?

Gracias por la ayuda.

EDIT:

he añadido esto a mi código pero que debería hacer lo mismo que está diciendo BrokenGlass excepto un poco diferente, pero todavía no funciona.

foreach (Cookie cookie in responseLogin.Cookies) 
     { 
      cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain)); 
      richTextBox2.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString(); 
     } 
+0

¿verificó lo que está en CookieJar cuando se ejecuta nueva solicitud? ¿contiene algo? – Artemiy

+0

hice un MessageBox.Show (cookieJar.Count.ToString()); y mostró que el recuento es 2 – Alex

Respuesta

21

Algo como esto debería funcionar, estoy usando un código similar para guardar una cookie entrada:

HttpWebRequest runTest; 
//...do login request 
//get cookies from response 

CookieContainer myContainer = new CookieContainer(); 
for (int i = 0; i < Response.Cookies.Count; i++) 
{ 
    HttpCookie http_cookie = Request.Cookies[i]; 
    Cookie cookie = new Cookie(http_cookie.Name, http_cookie.Value, http_cookie.Path); 
    myContainer.Add(new Uri(Request.Url.ToString()), cookie); 
} 

//later: 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.url.com/foobar"); 
request.CookieContainer = myContainer; 
+0

No creo que entiendo cómo implementar su idea. La solicitud de RunTest se realizará después del inicio de sesión inicial, y no sé los nombres de las cookies. ¿Puedes entrar en más detalles? – Alex

+0

@Alex: revisé mi respuesta para las cookies http - mi respuesta inicial la adapté del uso del servicio SOAP donde puede hacer la solicitud de inicio de sesión y luego obtener las cookies de la misma variable – BrokenGlass

+0

No estoy seguro de dónde encajaría exactamente su codificar con el mío No tengo una variable de "Respuesta" y mi aplicación no comprende qué es HttpCookie. Gracias por la ayuda otra vez – Alex

Cuestiones relacionadas