gxh973121

博客园 首页 新随笔 联系 订阅 管理

原文:http://www.cnblogs.com/tianfang/archive/2007/09/01/878545.html


我们用HttpWebRequest获取页面时,有的页面需要登录后才能获取。在大部分的web程序中,是用cookie来保存用户信息的,只要在发送WebRequest的时候附上用户的cookie信息,就可以很容易的获取到需要身份验证的页面信息了(本文也只讨论这种情况)。

方式如下:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.AllowAutoRedirect = false; //
禁止自动重定向
string cookieinfo = "Cookie: .ASPXAUTH=12EB2C50";
req.Headers.Add(cookieinfo);

可能有人会问第三行的cookieinfo是如何获取的,非常简单,首先用ie登录,登录时选取记住我的密码选项(大部分页面都有这种选项)。然后用ie登录你想要获取的页面url,同时监控ie的http头信息,从中即可找到类似"Cookie: .ASPXAUTH=12EB2C50"的选项,这个就是cookie的信息了,只要在你的WebRequest的头中加上如此信息即可。

注意代码中的第二行:
req.AllowAutoRedirect = false; //禁止自动重定向

该代码的作用是禁止自动重定向,如果没有该选项可能导致获取的页面是重定向的页面,而不是你要的页面。

这种方法简单易行。然而,有的页面无法记住密码选项,并且cookie比较容易失效。用ie获取的cookie很难供HttpWebReuest使用,这时就需要用HttpWebReuest来进行登录操作,从而获取该session的cookie。

登录方式如下:

HttpWebRequest reqlog = (HttpWebRequest)WebRequest.Create("http://localhost:2565/AspStudy/login.aspx");
//
开启cookie以启用session
reqlog.CookieContainer = new CookieContainer();

reqlog.AllowAutoRedirect = false; //
禁止自动重定向
reqlog.ServicePoint.Expect100Continue = false; //禁止100Continue

reqlog.Method = "POST";
reqlog.KeepAlive = true;
reqlog.ContentType = "application/x-www-form-urlencoded";
//req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";

//
此处post的信息格式可以通过httplook来得到
string info = "user=usr pwd=123";
byte[] loginfo = Encoding.ASCII.GetBytes(info);
//reqlog.ContentLength = loginfo.Length;
Stream reqStream = reqlog.GetRequestStream();
reqStream.Write(loginfo, 0, loginfo.Length);
reqStream.Close();

HttpWebResponse resp = reqlog.GetResponse() as HttpWebResponse;
Console.WriteLine(resp.Headers.ToString());
//
判断是否登陆成功
if (resp.StatusCode != HttpStatusCode.Found)
{
    throw new Exception("login fail");
}

//
维持登陆时的session
req.CookieContainer = reqlog.CookieContainer;

reqlog用来登录,这里的代码只是一个实例,不同的网站采用了不同的方式登录,仍然需要通过抓包来获取登录的具体方式。

如果reqlog登录成功,reqlog中的CookieContainer便保存了cookie信息,在新的request中使用该CookieContainer即可维持session状态,也就可以获取用户登录后的页面信息了。

上述代码中有这样一行:
reqlog.ServicePoint.Expect100Continue = false; //禁止100Continue

该行作用是不响应100号应答,如果不进行该项设置可能导致一次性post不成功,需要在100应答后才发送post数据,比较麻烦。

posted on 2008-04-07 02:40  gxh973121  阅读(816)  评论(0编辑  收藏  举报