2011-08-25 4 views
3

J'essaie de passer d'un contrôle de navigateur Web à des requêtes http pour l'automatisation des tâches de vitesse. Avec cette fonction, je peux publier des données et recevoir une page de connexion, mais aucun cookie n'est renvoyé et ajouté à la liste des cookies, de sorte que la session connectée n'est pas transmise à la prochaine requête.C# Site Web HttpWebRequest se connecter

//an example call   
    test("http://websitename.com/loginpage.php", "username=foo&password=123456"); 

    private string test(string url, string data) 
    { 
     string responseFromServer; 

     byte[] byteArray; 

     Stream dataStream; 

     HttpWebRequest request; 

     HttpWebResponse response; 

     StreamReader reader; 


     responseFromServer = string.Empty; 

     try 
     { 
      request = WebRequest.Create(url) as HttpWebRequest; 
      request.Method = "POST"; 
      request.KeepAlive = true; 
      request.ContentType = "application/x-www-form-urlencoded"; 

      byteArray = Encoding.UTF8.GetBytes(data); 
      request.ContentLength = byteArray.Length; 

      request.CookieContainer = new CookieContainer(); 

      foreach(Cookie a in cookies) 
       request.CookieContainer.Add(a); 

      dataStream = request.GetRequestStream(); 
      dataStream.Write(byteArray, 0, byteArray.Length); 
      dataStream.Close(); 

      response = request.GetResponse() as HttpWebResponse; 

      foreach(Cookie a in response.Cookies) 
       cookies.Add(a); 

      dataStream = response.GetResponseStream(); 
      reader = new StreamReader(dataStream); 
      responseFromServer = reader.ReadToEnd(); 

      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 
     } 
     catch (Exception x) 
     { 
      x.ToString(); 
     } 

     return responseFromServer; 
    } 

Comment puis-je le garder connecté?

+0

Pouvez-vous inclure toute la réponse HTTP (y compris les en-têtes)? (Par exemple, en utilisant [fiddler] (http://www.fiddler2.com/).) –

Répondre

1

Ce message semble avoir une réponse avec un nombre positif de vote: C# keep session id over httpwebrequest

Créer une instance CookieContainer dans votre première demande au serveur et au lieu de créer un nouveau pour votre prochaine demande, réutiliser cette instance .

9

Cette réponse finale est:

string url = "http://www.ABC/MemberShip/Login.aspx";// HttpContext.Current.Request.Url.AbsoluteUri.ToString().Replace("AutoLogin", "Login"); 

CookieContainer myCookieContainer = new CookieContainer(); 
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
request.CookieContainer = myCookieContainer; 
request.Method = "GET"; 
request.KeepAlive = false; 

HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

System.IO.Stream responseStream = response.GetResponseStream(); 
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8); 
string srcString = reader.ReadToEnd(); 

// get the page ViewState     
string viewStateFlag = "id=\"__VIEWSTATE\" value=\""; 
int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length; 
int j = srcString.IndexOf("\"", i); 
string viewState = srcString.Substring(i, j - i); 

// get page EventValidation     
string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\""; 
i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length; 
j = srcString.IndexOf("\"", i); 
string eventValidation = srcString.Substring(i, j - i); 

string submitButton = "LoginButton"; 

// UserName and Password 
string userName = "userid"; 
string password = "password"; 
// Convert the text into the url encoding string 
viewState = System.Web.HttpUtility.UrlEncode(viewState); 
eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation); 
submitButton = System.Web.HttpUtility.UrlEncode(submitButton); 

// Concat the string data which will be submit 
string formatString = 
     "txtUserName={0}&txtPassword={1}&btnSignIn={2}&__VIEWSTATE={3}&__EVENTVALIDATION={4}"; 
string postString = 
     string.Format(formatString, userName, password, submitButton, viewState, eventValidation); 

// Convert the submit string data into the byte array 
byte[] postData = Encoding.ASCII.GetBytes(postString); 

// Set the request parameters 
request = WebRequest.Create(url) as HttpWebRequest; 
request.Method = "POST"; 
request.Referer = url; 
request.KeepAlive = false; 
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; CIBA)"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.CookieContainer = myCookieContainer; 
System.Net.Cookie ck = new System.Net.Cookie("TestCookie1", "Value of test cookie"); 
ck.Domain = request.RequestUri.Host; 
request.CookieContainer.Add(ck); 
request.CookieContainer.Add(response.Cookies); 

request.ContentLength = postData.Length; 

// Submit the request data 
System.IO.Stream outputStream = request.GetRequestStream(); 
request.AllowAutoRedirect = true; 
outputStream.Write(postData, 0, postData.Length); 
outputStream.Close(); 


// Get the return data 
response = request.GetResponse() as HttpWebResponse; 
responseStream = response.GetResponseStream(); 
reader = new System.IO.StreamReader(responseStream, Encoding.UTF8); 
srcString = reader.ReadToEnd(); 
Response.Write(srcString); 
Response.End(); 
+1

Pour être considéré comme une réponse, ce morceau de code nécessite une explication (je crois ici à stackoverflow qu'aucune réponse ne peut être définie en disant simplement donc, donc la remarque est incorrecte) – konqi

+1

Le code devrait également disposer de choses qui implémentent IDisposable –

Questions connexes