2010-11-11 4 views
9

Ho un'applicazione winform su cui ho lavorato che esegue più test sugli account dei consumatori. I test richiedono un accesso unico per l'esecuzione.C# WebRequest utilizzando i cookie

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(); 

Questo script funziona per l'accesso più che bene, il problema è quando ho bisogno di eseguire i test in realtà ho bisogno di tornare tutti i risultati in una stringa (risultati 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; 
    } 

Ma va e tenta di accedere. Come posso utilizzare il cookie dalla precedente richiesta di accesso con questa + molte altre richieste web?

Grazie per l'aiuto.

EDIT:

ho aggiunto questo al mio codice ma che dovrebbe fare la stessa cosa come BrokenGlass sta dicendo, tranne un po 'diverso, ma ancora non funziona.

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

hai verificare cosa c'è in Cookiejar durante l'esecuzione di nuova richiesta? contiene qualcosa? – Artemiy

+0

ho fatto un MessageBox.Show (cookieJar.Count.ToString()); e ha dimostrato che il conteggio è 2 – Alex

risposta

21

Qualcosa del genere dovrebbe funzionare, io sto usando codice simile per salvare un cookie login:

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

Non penso di capire come implementare la tua idea. La richiesta runTest verrà eseguita dopo l'accesso iniziale e non conosco i nomi dei cookie. Puoi per favore entrare in maggiori dettagli? – Alex

+0

@Alex: ho rivisto la mia risposta per i cookie http - la mia risposta iniziale mi sono adattato dall'utilizzo del servizio SOAP in cui è possibile effettuare la richiesta di accesso e quindi ottenere i cookie dalla stessa variabile – BrokenGlass

+0

Non sono sicuro di dove esattamente mi piacerebbe codice con il mio. Non ho una variabile "Response" e la mia applicazione non capisce cosa sia HttpCookie. Grazie ancora per l'aiuto. – Alex