我做的这个程序目的是不用ie而模拟ie登录一个网站(阿里巴巴)然后将登录成功后的网页保存的本地硬盘中。我通过两次http请求来完成,第一次的目的是登录并得到网站给我的Cookie和重定向地址,第二次我就将这两样东西都绑定到一个请求中以便得到登录成功后的网页,但结果却是失败的,我不知道原因,但怀疑是不是session或者Cookie没有维持,而导致第二次请求未获成功,因为我查了第一次请求得到的CookieContainer中有十个Cookie,而我检查了FireFox登录后留下的Cookie却有十一个。代码不算长,请高手务必帮忙看一下,有急用
public void Login
{
string url = "http://china.alibaba.com/member/signin.htm";
/*****第一次发起请求*******/
HttpWebRequest myHttpRequest = (HttpWebRequest)WebRequest.Create(uri);
//要提交的表单数据。
string postdt = "action=Signin&eventSubmit_doPost=anywhere&Done=&LoginId=username&Password=password&Submit=登录";
byte[] bytes = Encoding.UTF8.GetBytes(postdt);
myHttpRequest.ContentType = "application/x-www-form-urlencoded";
myHttpRequest.ContentLength = bytes.Length;
myHttpRequest.Method = "POST";
myHttpRequest.CookieContainer = cookiecc;
myHttpRequest.UserAgent = "MSIE 6.0";
//这一段是怕这个网页有Referer设置
//myHttpRequest.Referer = @"http://china.alibaba.com/member/signin.htm";
// 获得请求的信息流,并将数据实体写入进去。
Stream requestStream = myHttpRequest.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
HttpWebResponse response = (HttpWebResponse) myHttpRequest.GetResponse( );
if (VerifyResponse(response) == ResponseCategories.Success)
{
Console.WriteLine("Request succeeded");
}
else return;
Stream responseStm = response.GetResponseStream();
//这两行是调试用的
Console.WriteLine(response.StatusCode);
/*第一次请求应该是成功的,因为如果用户名或密码是错的话
response.ResponseUri.OriginalString的内容还是
http://china.alibaba.com/member/signin.htm但如果提交正确则其内容就是最后登
录成功后后页面的地址*/
Console.WriteLine(response.ResponseUri.OriginalString);
Uri nui = response.ResponseUri;
//这里我原想可能cookiecc中的Cookie和response.Cookies中不一样故加在一起,但无
//效
//cookiecc.Add(response.Cookies);
//于是我干脆不要原来的Cookie再重新搞个新的CookieContainer但也无效
//CookieContainer ncookiecc = new CookieContainer();
//ncookiecc.Add(response.Cookies);
//response.Close();
//CookieContainer ncook = new CookieContainer();
//ncook.Add(response.Cookies);
/*********第二次请求成功登录的页面,代码与第一次差不多只是这次不用提交数据************/
HttpWebRequest myHttpRequest = (HttpWebRequest)WebRequest.Create(nui);
myHttpRequest.CookieContainer = cookiecc;
//myHttpRequest.ContentType = "application/x-www-form-urlencoded";
myHttpRequest.Method = "GET";
//myHttpRequest.ContentLength = bytes.Length;
myHttpRequest.UserAgent = "MSIE 6.0";
myHttpRequest.Referer = @"http://china.alibaba.com/member/signin.htm";
response = (HttpWebResponse)myHttpRequest.GetResponse();
Console.WriteLine(response.ResponseUri);
//response.Cookies = cookiecc.GetCookies(myHttpRequest.RequestUri); if (VerifyResponse(response) == ResponseCategories.Success)
{
Console.WriteLine("Request succeeded");
}
else return;
Stream nresponseStm = response.GetResponseStream();
StreamReader nstmReader = new StreamReader(nresponseStm, Encoding.GetEncoding("gb2312"));
string temp = nstmReader.ReadToEnd();
//Console.WriteLine(temp);
//将返回的html内容写入文本文件
StreamWriter sw = File.CreateText("c:/text.htm");
sw.Write(temp);
}
public void Login
{
string url = "http://china.alibaba.com/member/signin.htm";
/*****第一次发起请求*******/
HttpWebRequest myHttpRequest = (HttpWebRequest)WebRequest.Create(uri);
//要提交的表单数据。
string postdt = "action=Signin&eventSubmit_doPost=anywhere&Done=&LoginId=username&Password=password&Submit=登录";
byte[] bytes = Encoding.UTF8.GetBytes(postdt);
myHttpRequest.ContentType = "application/x-www-form-urlencoded";
myHttpRequest.ContentLength = bytes.Length;
myHttpRequest.Method = "POST";
myHttpRequest.CookieContainer = cookiecc;
myHttpRequest.UserAgent = "MSIE 6.0";
//这一段是怕这个网页有Referer设置
//myHttpRequest.Referer = @"http://china.alibaba.com/member/signin.htm";
// 获得请求的信息流,并将数据实体写入进去。
Stream requestStream = myHttpRequest.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
HttpWebResponse response = (HttpWebResponse) myHttpRequest.GetResponse( );
if (VerifyResponse(response) == ResponseCategories.Success)
{
Console.WriteLine("Request succeeded");
}
else return;
Stream responseStm = response.GetResponseStream();
//这两行是调试用的
Console.WriteLine(response.StatusCode);
/*第一次请求应该是成功的,因为如果用户名或密码是错的话
response.ResponseUri.OriginalString的内容还是
http://china.alibaba.com/member/signin.htm但如果提交正确则其内容就是最后登
录成功后后页面的地址*/
Console.WriteLine(response.ResponseUri.OriginalString);
Uri nui = response.ResponseUri;
//这里我原想可能cookiecc中的Cookie和response.Cookies中不一样故加在一起,但无
//效
//cookiecc.Add(response.Cookies);
//于是我干脆不要原来的Cookie再重新搞个新的CookieContainer但也无效
//CookieContainer ncookiecc = new CookieContainer();
//ncookiecc.Add(response.Cookies);
//response.Close();
//CookieContainer ncook = new CookieContainer();
//ncook.Add(response.Cookies);
/*********第二次请求成功登录的页面,代码与第一次差不多只是这次不用提交数据************/
HttpWebRequest myHttpRequest = (HttpWebRequest)WebRequest.Create(nui);
myHttpRequest.CookieContainer = cookiecc;
//myHttpRequest.ContentType = "application/x-www-form-urlencoded";
myHttpRequest.Method = "GET";
//myHttpRequest.ContentLength = bytes.Length;
myHttpRequest.UserAgent = "MSIE 6.0";
myHttpRequest.Referer = @"http://china.alibaba.com/member/signin.htm";
response = (HttpWebResponse)myHttpRequest.GetResponse();
Console.WriteLine(response.ResponseUri);
//response.Cookies = cookiecc.GetCookies(myHttpRequest.RequestUri); if (VerifyResponse(response) == ResponseCategories.Success)
{
Console.WriteLine("Request succeeded");
}
else return;
Stream nresponseStm = response.GetResponseStream();
StreamReader nstmReader = new StreamReader(nresponseStm, Encoding.GetEncoding("gb2312"));
string temp = nstmReader.ReadToEnd();
//Console.WriteLine(temp);
//将返回的html内容写入文本文件
StreamWriter sw = File.CreateText("c:/text.htm");
sw.Write(temp);
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货