HttpWebRequest登录论坛及其cookies的保存(转)

来源:互联网 发布:手机千里眼监控软件 编辑:程序博客网 时间:2024/05/21 11:30
 

string LOGIN_URL = @"http://www.pdhr.com/login.aspx";
string SECRET_PAGE_URL = "http://www.pdhr.com/enterprise/EnterpriseToday.aspx?MenuID=7";

HttpWebRequest webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest;
StreamReader responseReader = new StreamReader(
webRequest.GetResponse().GetResponseStream()
);
string responseData = responseReader.ReadToEnd();
responseReader.Close();

// extract the viewstate value and build out POST data
string viewState = ExtractViewState(responseData);
string postData =
String.Format(
"__VIEWSTATE={0}&UserLogin1:S_tbloginnamee={1}&UserLogin1:S_tbpassword={2}&UserLogin1:loginradio={3}&UserLogin1:S_btconfirm={4}",
viewState, "敏泰", "123456", "S_rbperson", "确 认"
);

// have a cookie container ready to receive the forms auth cookie
CookieContainer cookies = new CookieContainer();
CookieContainer reqcookies = new CookieContainer();

// now post to the login form
webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest;
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
webRequest.CookieContainer = cookies;

// write the form values into the request message
StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream());
requestWriter.Write(postData);
requestWriter.Close();

// we don't need the contents of the response, just the cookie it issues
webRequest.GetResponse().Close();
CookieCollection cookieheader = webRequest.CookieContainer.GetCookies(new Uri(LOGIN_URL));


// now we can send out cookie along with a request for the protected page
webRequest = WebRequest.Create(SECRET_PAGE_URL) as HttpWebRequest;

webRequest.CookieContainer = cookies;
webRequest.Referer = SECRET_PAGE_URL;
webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
webRequest.ContentType = "application/x-www-form-urlencoded";
responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream(),Encoding.GetEncoding("gb2312"));
cookieheader = webRequest.CookieContainer.GetCookies(new Uri(SECRET_PAGE_URL));

// and read the response
responseData = responseReader.ReadToEnd();
responseReader.Close();

Response.Write(responseData);

=========================================

   关于采用WinForms方式登录Web论坛,已经研究有一段时间了。一波三折,终于有点满意的结论了!

         开始对此问题产生兴趣时,在CSDN.net找过一些参考资料:
http://community.csdn.net/Expert/topic/4659/4659063.xml?temp=.9342005
http://blog.csdn.net/Qqwwee_Com/category/146601.aspx
……
我也就模仿地进行了一些工作,但依然没有办法解决自己的问题。表现在:登录的次数每次都加1,但ID却显示为不在线!很多次都这个结果:就是能够登录,但刚登录就断开连接。什么原因呢?跟什么技术有关系呢?Cookies? Session? 但是,断点调试时,只是在webRequest.GetResponse() 之后断点,然后在网页上看ID是否在线,依然不在线。不可能阿,就算真的是Cookies、Session的问题,也没有那么快的。那究竟有登录吗?有的,登录次数有增加。在哪里出错呢?
         这个问题,耽误了好多天,也因此查了很多资料,联系了一些文章的作者,但就是没有办法……
         突然,有一天,我用Web方式登录论坛,并无意间跑去看自己是否在线;不看还好,看了吓一跳:我居然不在线!为什么呢?此时此刻,我想到我曾经设置过隐身,居然是隐身惹的祸?赶紧跑到个人设置的页面,把我的状态设置为公开。然后迫不及待地打开VS,急急忙忙地运行了停顿多日的项目。当再一次查看ID在线状态时,终于见到了我用WinForms登录的结果!
         教训:今后做用户信息相关的设计时,别忘了看看该用户是否隐身的!很多论坛不只表示用户是否在线,还有说明当前在那个版面或是某种状态,这时就要注意了阿^_^
至此,事情也只是告一段落,只是得到一定程度的解决。接着又有了另一个问题:登录成功后,怎么保存登录状态呢?参考资料表明:保存登录后的Cookies,今后发送请求时,附上该Cookies就可以了(Session也是同样采用保存Cookies的方法)。事实如此?
于是,我测试着这样做:
WebResponse=webRequest.GetResponse();
CookieCollection Cookies= WebResponse.Cookies;
但是,这个时候我发现行不通。因为登录页面的域名,和各个版面的域名不同,通过调试,我发现Cookies的内容不同,所以行不通!该怎么办呢?又该到了明察暗访的时候了。
……
http://community.csdn.net/Expert/topic/4932/4932839.xml?temp=.4951898
这是我近日看到的一篇文章,可惜的是我看不出他的问题在哪里。反而有了疑问:保存Cookies不是在WebResponse.Cookies获得的吗?怎么是在 webRequest.CookieContainer?难道这就是该文章的问题所在?于是采用断点的方式查看,果然发现了问题:
采用WebResponse.Cookies,获得的只是一个Cookie,而在webRequest.CookieContainer却可以看到有3个Cookies,而且明显说明属于3个不同的域名的!
于是,我明白了问题之所在,我把每次请求后的webRequest.CookieContainer保存以供下次访问时发送。终于能够使用保存下来的Cookies来登录各个版面了。
原创粉丝点击