We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

Using cookies with HttpWebRequest

alc
alc asked
on
Medium Priority
1,422 Views
Last Modified: 2007-12-19
I'm working on building a program that will log into a web site using cookies and extract data from the page. I'm using HttpWebRequest. I know there is a CookieContainer property but I haven't quite figured out how to get this to work yet. Ideally I'd like to be able to load the cookie data from a file on my computer and access the page using HttpWebRequest. Does anybody have some code samples I could try?
Comment
Watch Question

Hi alc,

You will have to follow these steps

1.- Make an HttpWebRequest and set yourRequest.CookieContainer = new CookieContainer.
2.- Point the request the login page and post login/password info.
3.- Set your httpwebresponse.cookies to request.CookieContainer.GetCookies(request.RequestUri)
4.- Store the cookies somewhere for later use
5.- For future requests add your stored cookies in the cookieContainer object of your request.



Esteban Felipe
www.estebanf.com
alc

Author

Commented:
Esteban,

In step 2 you say to post the login/password info. I'm not quite sure how to do this. When I review the cookies on my computer I can see my user name and the encrypted password. Where does this information go in the Cookie? The Cookie object has a Value property but I'm not sure how this is used. Can you post some sample code that does this?
To post data you will need to:

string strPost="login=yourlogin&password=yourpassword";
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(thetargeturlloginpage);
objRequest.CookieContainer = new CookieContainer();
objRequest.Method = "POST";
objRequest.ContentLength = strPost.Length;
objRequest.ContentType = "application/x-www-form-urlencoded";
StreamWriter writer = new StreamWriter(objRequest.GetRequestStream());
writer.write(strPost);
writer.close();
HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
objResponse.Cookies = objRequest.CookieContainer.GetCookies(objRequest.RequestUri);
foreach(Cookie cookie in objResponse.Cookies)
{
//Save to cookies. I would binary serialize to disk, but any method should work
}


the actual string to post will depend of your target page. You are supposed to send all data that would be send by a html form. So, check out the html source code and find what values it's expecting. For example if you find that the source code have something like:
Login = <input type="text" id="username">
password = <input type="password" id="userpassword">
remember me <input type="checkbox" id="rememberme">

you will have to post something like ="username=YOURUSERNAME&userpassword=YOURPASSWORd&rememberme=true"

In later request you would do


HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(thetargetpageurlthatrequireloggeduser);
objRequest.CookieContainer = new CookieContainer();
objRequest.CookieContainer.Add(YOURSAVEDCOOKIES); //if there's more than one, add them all
HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
//Work with objResponse from here.

Esteban Felipe
www.estebanf.com
alc

Author

Commented:
Esteban,

That helped, but I'm still not getting the response I expected. I can see that I'm now getting cookies in the response. However, the response stream is empty. I'm not sure why this is. Any ideas?
Can i see your code please?
alc

Author

Commented:
try
{

      HttpWebRequest oReq =
            (HttpWebRequest)WebRequest.Create("http://www.investors.com/login.asp?/register/default.asp?location=/member/checkup/checkup.asp?t=ge&ss=yes&survey=falsewinname=registrationend:;");
      oReq.CookieContainer = new CookieContainer();
      string strPost = "htmUserName=<username>&htmPassword=<password>";                  oReq.Method = "POST";
      oReq.ContentLength = strPost.Length;
      oReq.ContentType = "application/x-www-form-urlencoded";
      StreamWriter writer = new StreamWriter(oReq.GetRequestStream());
      writer.Write(strPost);
      writer.Close();

      HttpWebResponse oResp = (HttpWebResponse)oReq.GetResponse();
      oResp.Cookies = oReq.CookieContainer.GetCookies(oReq.RequestUri);

      // Print the properties of each cookie.
      foreach (Cookie cook in oResp.Cookies)
      {
            Debug.WriteLine("Cookie:");
            Debug.WriteLine(cook.Name + " = " + cook.Value);
            Debug.WriteLine("Domain: " + cook.Domain);
            Debug.WriteLine("Path: " + cook.Path);
            Debug.WriteLine("Port: " + cook.Port);
            Debug.WriteLine("Secure: " + cook.Secure);
   
            Debug.WriteLine("When issued: " + cook.TimeStamp);
            Debug.WriteLine("Expires: " + cook.Expires + " (expired? " + cook.Expired + ")");
            Debug.WriteLine("Don't save: " + cook.Discard);    
            Debug.WriteLine("Comment: " + cook.Comment);
            Debug.WriteLine("Uri for comments: " + cook.CommentUri);
            Debug.WriteLine("Version: RFC " + (cook.Version == 1 ? "2109" : "2965"));

            // Show the string representation of the cookie.
            Debug.WriteLine ("String: " + cook.ToString());
      }

      Stream oStream = oResp.GetResponseStream();
      Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
      StreamReader oStreamRead = new StreamReader( oStream, encode );

      WriteStream(oStreamRead);

      oResp.Close();
      oStreamRead.Close();
      oStream.Close();
}
catch(WebException e)
{
      Debug.WriteLine("Web Exception"+
            "\n\nException Message :" + e.Message);
      if(e.Status == WebExceptionStatus.ProtocolError)
      {
            Debug.WriteLine("Status Code : " + ((HttpWebResponse)e.Response).StatusCode);
            Debug.WriteLine("Status Description : " + ((HttpWebResponse)e.Response).StatusDescription);
      }
}

private void WriteStream(StreamReader oStreamRead)
{
      string strLine;

      while ((strLine = oStreamRead.ReadLine()) != null)
      {
            Debug.WriteLine(strLine);
      }

}
Questions:
1.- Do you get any cookie printed?
2.- What response are you getting and what response are you expecting to get?
alc

Author

Commented:
1 - Yes, I get one cookie in the response.
2 - There is nothing in the Response Stream. The first ReadLine() is null.
uhmm... weird... Tell me something, ┬┐what's the normal behavior of that page? Is theres any chance that after you login you get a response.redirect?.
alc

Author

Commented:
Yes, I think it is doing a response redirect. The URL changes once I login and another IE window is loaded with the page I want.
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview
alc

Author

Commented:
Yes, I tried accessing the page directly once I had the cookies but for some reason it didn't have any HTML. It only had a bunch of Javascript.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.