P
Peter Qian
Hi,
I'm working on a windows form based program that can log into a web
service (Apache based, https is used for auth). I was able to post the login
data and obtain a sessionID. However I'm not sure how to maintain this id
over multiple requests. Here are my code:
Globle Varibles
private static int timeOut = 20000;
private CookieContainer cookieContainer; /* other cookies */
private string headerCookie; /* often stores session info */
private string cookieHeader;
1. Login Routine:
public bool OpenLoginSession( string url,
System.Collections.Specialized.NameValueCollection param )
{
WebHeaderCollection headers;
bool statusOK;
HttpWebRequest loginReq =
(HttpWebRequest)WebRequest.Create(url);
cookieContainer = new CookieContainer();
HttpWebResponse loginRes;
//
// Login Request
//
loginReq.CookieContainer = cookieContainer;
loginReq.KeepAlive = false;
loginReq.Method = "POST";
loginReq.AllowAutoRedirect = false;
//
// Build POST stream
//
System.Text.StringBuilder query = new StringBuilder();
query.Append("?");
foreach( string key in param.Keys )
{
query.AppendFormat("{0}={1}&", key, param[key]);
}
byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(
query.ToString() );
Stream os = loginReq.GetRequestStream();
os.Write( buf, 0, buf.Length );
os.Close();
//
// POST the info
//
loginRes = (HttpWebResponse)loginReq.GetResponse();
cookieHeader = cookieContainer.GetCookieHeader(
loginReq.RequestUri );
if ( loginReq.HaveResponse && loginRes.StatusCode ==
HttpStatusCode.OK )
{
headers = loginRes.Headers;
if ( headers["Set-Cookie"] != null )
{
headerCookie = headers["Set-Cookie"];
}
statusOK = true;
}
else
statusOK = false;
loginRes.Close();
return(statusOK);
}
Note, after this routine, "cookieHeader" is an empty string for some reason,
and headerCookie stores the sessionID correctly.
2. Browsing Routine
public void BrowseSecuredUrl( string url )
{
HttpWebRequest req =
(HttpWebRequest)WebRequest.Create(url);
HttpWebResponse res;
cookieContainer = new CookieContainer();
req.CookieContainer = cookieContainer;
req.KeepAlive = false;
req.Headers.Add("Cookie", headerCookie);
cookieContainer.SetCookies( req.RequestUri ,
cookieHeader );//error here
res = (HttpWebResponse)req.GetResponse();
...
res.Close();
}
The error I'm getting "is An error has occurred when parsing Cookie header
for Uri '...'"
I'm wondering what is the correct way of doing things?
Thanks!
Regards,
Peter
I'm working on a windows form based program that can log into a web
service (Apache based, https is used for auth). I was able to post the login
data and obtain a sessionID. However I'm not sure how to maintain this id
over multiple requests. Here are my code:
Globle Varibles
private static int timeOut = 20000;
private CookieContainer cookieContainer; /* other cookies */
private string headerCookie; /* often stores session info */
private string cookieHeader;
1. Login Routine:
public bool OpenLoginSession( string url,
System.Collections.Specialized.NameValueCollection param )
{
WebHeaderCollection headers;
bool statusOK;
HttpWebRequest loginReq =
(HttpWebRequest)WebRequest.Create(url);
cookieContainer = new CookieContainer();
HttpWebResponse loginRes;
//
// Login Request
//
loginReq.CookieContainer = cookieContainer;
loginReq.KeepAlive = false;
loginReq.Method = "POST";
loginReq.AllowAutoRedirect = false;
//
// Build POST stream
//
System.Text.StringBuilder query = new StringBuilder();
query.Append("?");
foreach( string key in param.Keys )
{
query.AppendFormat("{0}={1}&", key, param[key]);
}
byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(
query.ToString() );
Stream os = loginReq.GetRequestStream();
os.Write( buf, 0, buf.Length );
os.Close();
//
// POST the info
//
loginRes = (HttpWebResponse)loginReq.GetResponse();
cookieHeader = cookieContainer.GetCookieHeader(
loginReq.RequestUri );
if ( loginReq.HaveResponse && loginRes.StatusCode ==
HttpStatusCode.OK )
{
headers = loginRes.Headers;
if ( headers["Set-Cookie"] != null )
{
headerCookie = headers["Set-Cookie"];
}
statusOK = true;
}
else
statusOK = false;
loginRes.Close();
return(statusOK);
}
Note, after this routine, "cookieHeader" is an empty string for some reason,
and headerCookie stores the sessionID correctly.
2. Browsing Routine
public void BrowseSecuredUrl( string url )
{
HttpWebRequest req =
(HttpWebRequest)WebRequest.Create(url);
HttpWebResponse res;
cookieContainer = new CookieContainer();
req.CookieContainer = cookieContainer;
req.KeepAlive = false;
req.Headers.Add("Cookie", headerCookie);
cookieContainer.SetCookies( req.RequestUri ,
cookieHeader );//error here
res = (HttpWebResponse)req.GetResponse();
...
res.Close();
}
The error I'm getting "is An error has occurred when parsing Cookie header
for Uri '...'"
I'm wondering what is the correct way of doing things?
Thanks!
Regards,
Peter