当前位置: 首页 > 图文教程 > .Net技术 > ASP.NET > 详解ASP.NET的四种状态

ASP.NET
VS2008SP1下jQuery使用初体验
使用asp.net 2.0中的SqlBulkCopy类批量复制数据
asp.net定点执行任务总结
通过webBrowser 来轻松模拟网页来源
ASP.NET框架 数据回发与事件回发
浅谈ASP.NET内部机制
通用语言规范
GC垃圾回收
ASP.NET 配置
ASP.NET 安全认证
ASP.NET生成复合控件
asp.net中forms验证
DataTable中数据记录的统计
关于无aspx文件部署,我的一些探索心得
ASP.NET刷新页面的六种方法
ASP.NET MVC应用程序的本地化、单元测试
详解ASP.NET的四种状态
.NET与Java间进行Web Service交互的选择
自己动手实现Asp.net的MVC框架
ASP.net中网站访问量统计方法

详解ASP.NET的四种状态


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 83 ::
收藏到网摘: n/a

这些状态的原理对于做.NET开发非常重要。最近整理一下,发布到软晨学习网网站上,希望对大家有所帮助。现在详细解说一下。

视图状态:视图状态就在大家身边不知道大家是否注意。ASP.NET是基于服务其处理事件的。当服务器处理完事件时,再返回本窗体时,如果没有视图状态,原来的数据将不会在有。这样说也许会晕。举个列子,比如有一个网站需要你注册成为会员。当你填完信息,(一般来说页面会转向别的地方)这里为了说明问题,我们让他返回原来的页面继续操作,如果没有视图状态,则你以前填的数据都没有了。如果有视图状态,则原来的数据还在。试图状态在一些时候很有用。比如说分级验证时。

那么.NET是用什么方法保持试图状态呢?这里微软采用了一种特殊的方法。在浏览器打开网页的源代码,你会发现一段你在编辑网页时,没有添加的一个HTML控件。

形式是这样的:

<input type="hidden" name="_VIEWSTATE" id="_VIEWSTATE" value="一些加密过的值"/>

这是.NET自动给你添加的。它也是视图状态能够实现的功臣。因为这个空间是隐藏的,所以不会破坏页面的布局。空件中的value中的值就是就是各个空件以及控件中的数据(状态)。这些数据是经过哈希函数加密过的。这是为了安全考虑。当网页提交时,浏览器首先将当前网页中的各种状态(包括控件以及控件中的数据)保存到这个HTML字段中。当网页再次返回浏览器时,在自动把这些状态返回给网页,这样网页也就恢复了状态。

再来讲讲视图状态需要注意的问题。

视图状态只能在本网页与服务器之间保持,不能在不同网页之间连接时保持。默认情况下,几乎所有的ASP.NET控件都有保持视图状态的功能。

视图状态有很多优点,但同样(世上每件事都具有两面性,一个好的技术也不列外)有些缺点。首先是安全,虽然数据是经过加密,但对于黑客中的骨灰级人物,还是很不安全的。再次,你可以想如果你的页面包括几百条记录,页面很复杂,这是必会影响网页的加载速度。

应用程序状态(Application):Application对象是应用程序的全局性对象。用于存放应用程序的全局共享资源。他的本质是HttpApplicationState类的一个实例。当用户第一次反问某虚目录中的资源时,就被创建。也就是说网站第一次在互联网上发布,这时有一个用户刚好访问你的虚拟目录资源,那么Application对象就已经建立。在资源与应用程序之间建立了一个缓冲区。

应用程序状态只有在网站运行时存在。当应用程序推出或服务器关闭时(更惨一点服务器崩溃了),应用程序状态中保存的数据机会丢失和损坏。所以对于需要永久保留的资源还是在数据库中持久化保存的好。

介绍一些Application对象的一些操作方法。

Application对象当然是采用最经典的“键-值”对的字典方法来定义。其中键为字符串代表Application对象的名称。值可以是任何类型的数据。(例如HTML,CSS,SQL都可以)。举个例子:

 

Application["source"]="special source";

 

string message =Application["source"].ToString();

在Application中添加删除保存的对象。

Application.Add("source",''special source");

Application.remove("source");

来一个狠一点的操作,把Application中的对象全部请出去。

Application.Clear();

或Appication.RemoveAll();

信息共享自然会引来一个问题,资源的同步竞争。这类问题解决当然要靠锁了。

Applicatin.Lock()//加锁锁定资源,不让其他进程访问。

functions(Application["source"]);//一些操作Application对象的操作。

Application.UnLock();//解除锁定。

会话状态(Session):Session对象用来保存单个用户的状态。在网站中,每个新访问的用户都将产生自己的会话(Session)对象。这个Session对象是在服务器端进行管理,只能为它所绑定的用户服务。如果另一位用户也访问网站,他也经拥有自己的Sesiion对象。两个用户的Session对象即使同名,也不能共享同一个Session对象。各是各的。

实际上Session对象是HttpSessionState类的实例。有很多属性和方法,大家不妨去看看。这里不阐述了。

就一些例子吧。

 

Session["source"]="special source";

string message =Session["source"].ToString();

应用程序状态在网站中总是可用的,这.NET Framework的内部机制,我们不去管。我们来看看Session对象。由于在Machine.config配置文件中的Session设置是启动的,因此不需要额外的步骤就能使用它。