注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Dotnet >> C# >> Dotnet正文

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

文章来源:中国IT实验室收集整理 作者:佚名 更新时间:2008-5-25 3:56:04 【 】 【加入收藏
     在上篇笔记中,描述了在C#中如何使用HttpWebRequest、HttpWebResponse登录简单网站,但如果用同样的方法去访问一个需要登录后才能访问的页面,会出现什么结果呢?让我们先来尝试一下!

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

(图一)
    从抓包截图(图一)上可以看到,当程序访问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页面。

(图二)
    图二是第二次尝试中庸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页面。

    以下是修改后的代码:
CookieContainer cookieContainer = new CookieContainer(); // 声明CookieContainer对象

// 登录网站
HttpWebRequest loginHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost/TestLogin/Default.aspx");
loginHttpWebRequest.CookieContainer = cookieContainer; // 给HttpWebRequest指定CookieContainer

byte[] byteRequest = Encoding.Default.GetBytes(postData);
loginHttpWebRequest.ContentType = contentType;
loginHttpWebRequest.Referer = "http://localhost/TestLogin/Default.aspx";
loginHttpWebRequest.Accept = accept;
loginHttpWebRequest.UserAgent = userAgent;
loginHttpWebRequest.Method = "POST";
loginHttpWebRequest.ContentLength = byteRequest.Length;

Stream stream = loginHttpWebRequest.GetRequestStream();
stream.Write(byteRequest, 0, byteRequest.Length);
stream.Close();

loginHttpWebRequest.GetResponse();

// 访问LoginSuccess.aspx
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://localhost/TestLogin/LoginSuccess.aspx");
httpWebRequest.CookieContainer = cookieContainer; // 给HttpWebRequest指定CookieContainer
httpWebRequest.GetResponse(); 
    下图是抓包截图:

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

    点击下载示例代码(VS2008)
  • 上一篇Dotnet:

  • 下一篇Dotnet:
  • 最 新 热 门
     asp根据表单自动生成sql语句的函数
     ASP教程:自己写的数据库操作类
     ASP处理多关键词查询实例代码
     asp文件打不开的原因
     IIS7.0在Vista系统下安装注意事项
     XMLHTTP Post Form时的表单乱码
     xmlhttp是如何完成异步操作的
     VB.Net处理MySQL中二进制问题
     VB.NET的常量与枚举学习
     VB.NET字符数据类型和其他数据类型
    最 新 推 荐
     运用设计模式构建通用数据库访问类
     C#中使用钩子控制鼠标实现代码
     C#打开SolidWorks2008零件文件
     C# 实现屏幕键盘 (ScreenKeyboard)
     C#发现之旅第二讲_C#-XSLT开发
     C#数字格式化输出
     C#中通过API调用获取文件图标
     C#中一套生成sql条件的类
     C#汉字转拼音功能类
     DataGridView的常用用法
    相 关 文 章

    C#中使用钩子控制鼠标实现代码
    C#打开SolidWorks2008零件文件
    C# 实现屏幕键盘 (ScreenKeyboard)
    C#发现之旅第二讲_C#-XSLT开发
    C#数字格式化输出
    C#中通过API调用获取文件图标
    C#中一套生成sql条件的类
    C#汉字转拼音功能类
    C#基础入门学习笔记
    C#正则表达式快速入门

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用