频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

C#网站(二):访问需登录后才能访问

来源:中国IT实验室 作者:佚名 出处:巧巧读书 2008-05-12 进入讨论组

     在上篇笔记中,描述了在C#中如何使用HttpWebRequest、HttpWebResponse登录简单网站,但如果用同样的方法去访问一个需要登录后才能访问的页面,会出现什么结果呢?让我们先来尝试一下!

    尝试一:在上篇笔记中,创建了一个用于测试的简单网站,其中LoginSuccess.aspx页面是需要登录后才能访问的(没登录的用户访问该页面,会被重定向到default.aspx页面)。这里我们调用GetHtml("http://localhost/TestLogin/LoginSuccess.aspx")来直接访问LoginSuccess.aspx页面,同时用HTTP Analyzer抓包:

C#网站(二):访问需登录后才能访问(图一)
点击查看大图

(图一)


    从抓包截图(图一)上可以看到,当程序访问LoginSuccess.aspx页面时,被重定向到default.aspx页面去了,证明不能直接访问。

    尝试二:那么是不是用程序先在defaul.aspx中登录后在访问LoginSuccess.aspx页面就OK了呢?我们再来尝试一下:1. 调用GetHtml("http://localhost/TestLogin/Default.aspx", postData, Method.POST)登录;2.调用GetHtml("http://localhost/TestLogin/LoginSuccess.aspx")访问LoginSuccess.aspx页面。

C#网站(二):访问需登录后才能访问(图二)
(图二)


    图二是第二次尝试中庸HTTP Analyzer抓包的截图。1、2:程序在Default.aspx中登录成功后,自动跳转至LoginSuccess.aspx;3、4:程序在登录成功后,访问LoginSuccess.aspx页面,被重定向到Default.aspx。看来这次的尝试又失败了。

    然道没办法在程序中访问需登录后才能访问的页面了吗?答案是否定的!那么该如何实现呢?在实现前,有一些基础知识是要先了解的:

以下文字转自深蓝的博客文章《使用C#实现网站用户登录》

HTTP协议是一个无连接的协议,也就是说这次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器之前在刚建立会话时将在服务器内存中建立一个Session,该Session标识了该用户(浏览器),每一个Session都有一个唯一的ID,第一次建立会话时服务器将生成的这个ID传给浏览器,浏览器在接下来的浏览中每一个发向服务器的请求中都将包含该SessionID,从而标识了自己的身份。

服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚建立会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该 Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。


    哈哈,原来是Cookie的原因啊!看来我们只需在访问需登录的页面时把该网站对应的Cookie带上就OK了。这里使用CookieContainer来保存Cookie。

    尝试三:给HttpWebRequest指定CookieContainer,登录并访问LoginSuccess.aspx页面。

    以下是修改后的代码:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->

C#网站(二):访问需登录后才能访问(图三)CookieContainer cookieContainer = new CookieContainer(); // 声明CookieContainer对象

C#网站(二):访问需登录后才能访问(图三)

C#网站(二):访问需登录后才能访问(图三)// 登录网站

C#网站(二):访问需登录后才能访问(图三)HttpWebRequest loginHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost/TestLogin/Default.aspx");

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.CookieContainer = cookieContainer; // 给HttpWebRequest指定CookieContainer

C#网站(二):访问需登录后才能访问(图三)

C#网站(二):访问需登录后才能访问(图三)byte[] byteRequest = Encoding.Default.GetBytes(postData);

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.ContentType = contentType;

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.Referer = "http://localhost/TestLogin/Default.aspx";

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.Accept = accept;

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.UserAgent = userAgent;

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.Method = "POST";

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.ContentLength = byteRequest.Length;

C#网站(二):访问需登录后才能访问(图三)

C#网站(二):访问需登录后才能访问(图三)Stream stream = loginHttpWebRequest.GetRequestStream();

C#网站(二):访问需登录后才能访问(图三)stream.Write(byteRequest, 0, byteRequest.Length);

C#网站(二):访问需登录后才能访问(图三)stream.Close();

C#网站(二):访问需登录后才能访问(图三)

C#网站(二):访问需登录后才能访问(图三)loginHttpWebRequest.GetResponse();

C#网站(二):访问需登录后才能访问(图三)

C#网站(二):访问需登录后才能访问(图三)// 访问LoginSuccess.aspx

C#网站(二):访问需登录后才能访问(图三)HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost/TestLogin/LoginSuccess.aspx");

C#网站(二):访问需登录后才能访问(图三)httpWebRequest.CookieContainer = cookieContainer; // 给HttpWebRequest指定CookieContainer

C#网站(二):访问需登录后才能访问(图三)httpWebRequest.GetResponse();


    下图是抓包截图:

C#网站(二):访问需登录后才能访问(图四)

点击查看大图

(图三)


    注意和图二的区别,少了个“4”,这就说明:程序成功访问了需登录后才能访问的页面LoginSuccess.aspx。

    点击下载示例代码(VS2008)

更多文章 更多内容请看网站服务器的选型专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章