2010-11-11 23 views
9

J'ai une application winforms sur laquelle j'ai travaillé et qui exécute plusieurs tests sur des comptes clients. Les tests nécessitent une connexion unique pour s'exécuter.C# Demande Web utilisant des 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(); 

Ce script fonctionne pour la connexion très bien, le problème est quand je dois courir en fait les tests que je dois retourner tous les résultats dans une chaîne (résultats 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; 
    } 

Mais ça marche et tente de se connecter. Comment puis-je utiliser le cookie de la demande de connexion précédente avec ce + de nombreuses autres demandes Web?

Merci pour l'aide.

EDIT:

J'ajouté à mon code mais qui devrait faire la même chose que BrokenGlass dit, sauf un peu différent, mais ne fonctionne toujours pas.

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

Avez-vous vérifié ce qui est en CookieJar lors de l'exécution nouvelle demande? ça contient quelque chose? – Artemiy

+0

J'ai fait un MessageBox.Show (cookieJar.Count.ToString()); et il a montré que le compte est 2 – Alex

Répondre

21

Quelque chose comme ça devrait fonctionner, je suis en utilisant un code similaire pour enregistrer un cookie de connexion:

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

Je ne pense pas que je comprends comment mettre en œuvre votre idée. La requête runTest sera effectuée après la connexion initiale, et je ne connais pas les noms des cookies. Pouvez-vous s'il vous plaît entrer dans plus de détails? – Alex

+0

@Alex: J'ai révisé ma réponse pour les cookies http - ma réponse initiale je me suis adapté de l'utilisation du service SOAP où vous pouvez faire la demande de connexion et ensuite obtenir les cookies de la même variable – BrokenGlass

+0

Je ne sais pas exactement où je correspondrais code avec le mien. Je n'ai pas de variable "Response" et mon application ne comprend pas ce qu'est HttpCookie. Merci encore pour l'aide. – Alex