这些状态的原理对于做NET开发非常重要现在详细解说一下
视图状态视图状态就在大家身边不知道大家是否注意ASPNET是基于服务其处理事件的当服务器处理完事件时再返回本窗体时如果没有视图状态原来的数据将不会在有这样说也许会晕举个列子比如有一个网站需要你注册成为会员当你填完信息(一般来说页面会转向别的地方)这里为了说明问题我们让他返回原来的页面继续操作如果没有视图状态则你以前填的数据都没有了如果有视图状态则原来的数据还在试图状态在一些时候很有用比如说分级验证时
那么NET是用什么方法保持试图状态呢?这里微软采用了一种特殊的方法在浏览器打开网页的源代码你会发现一段你在编辑网页时没有添加的一个HTML控件
形式是这样的
<input type=
hidden
name=
_VIEWSTATE
id=
_VIEWSTATE
value=
一些加密过的值
/>
这是NET自动给你添加的它也是视图状态能够实现的功臣因为这个空间是隐藏的所以不会破坏页面的布局空件中的value中的值就是就是各个空件以及控件中的数据(状态)这些数据是经过哈希函数加密过的这是为了安全考虑当网页提交时浏览器首先将当前网页中的各种状态(包括控件以及控件中的数据)保存到这个HTML字段中当网页再次返回浏览器时在自动把这些状态返回给网页这样网页也就恢复了状态
再来讲讲视图状态需要注意的问题
视图状态只能在本网页与服务器之间保持不能在不同网页之间连接时保持默认情况下几乎所有的ASPNET控件都有保持视图状态的功能
视图状态有很多优点但同样(世上每件事都具有两面性一个好的技术也不列外)有些缺点首先是安全虽然数据是经过加密但对于黑客中的骨灰级人物还是很不安全的再次你可以想如果你的页面包括几百条记录页面很复杂这是必会影响网页的加载速度
应用程序状态(Application):Application对象是应用程序的全局性对象用于存放应用程序的全局共享资源他的本质是HttpApplicationState类的一个实例当用户第一次反问某虚目录中的资源时就被创建也就是说网站第一次在互联网上发布这时有一个用户刚好访问你的虚拟目录资源那么Application对象就已经建立在资源与应用程序之间建立了一个缓沖区
应用程序状态只有在网站运行时存在当应用程序推出或服务器关闭时(更惨一点服务器崩溃了)应用程序状态中保存的数据机会丢失和损坏所以对于需要永久保留的资源还是在数据库中持久化保存的好
介绍一些Application对象的一些操作方法
Application对象当然是采用最经典的键值对的字典方法来定义其中键为字符串代表Application对象的名称值可以是任何类型的数据(例如HTMLCSSSQL都可以)举个例子
Application[source]=special source;string message =Application[source]ToString();
在Application中添加删除保存的对象
ApplicationAdd(sourcespecial source);
Applicationremove(source);
来一个狠一点的操作把Application中的对象全部请出去
ApplicationClear();
或AppicationRemoveAll();
信息共享自然会引来一个问题资源的同步竞争这类问题解决当然要靠锁了
ApplicatinLock()//加锁锁定资源不让其他进程访问
functions(Application[source]);//一些操作Application对象的操作
ApplicationUnLock();//解除锁定
会话状态(Session):Session对象用来保存单个用户的状态
在网站中
每个新访问的用户都将产生自己的会话(Session)对象
这个Session对象是在服务器端进行管理
只能为它所绑定的用户服务
如果另一位用户也访问网站
他也经拥有自己的Sesiion对象
两个用户的Session对象即使同名
也不能共享同一个Session对象
各是各的
实际上Session对象是HttpSessionState类的实例有很多属性和方法大家不妨去看看这里不阐述了
就一些例子吧
Session[
source
]=
special source
;
string message =Session[source]ToString();
应用程序状态在网站中总是可用的这NET Framework的内部机制我们不去管我们来看看Session对象由于在Machineconfig配置文件中的Session设置是启动的因此不需要额外的步骤就能使用它尽管如此我们还是要知道一些原理和本质Machineconfig和应用程序的Webconfig中的设置决定了是启动还是关闭Session对象当然如果想要延迟到需要时在启用也可以我们可以在页面一级设置
//这条语句的作用是在这个页面中不能使用会话状态(Session)
Session对象有一个Timeout属性可以设置Session对象的生命周期它以分钟为单位默认是分钟如果再有效时间内没有连接服务器那么Session的所有设置都将失效如果需要终止Session对象可以用它的Abandon()方法
差点忘了Session有一点很重要补充一下
session中的关键字是不区分大小写的因此不要用大小写来区分Session变量也就是说Session[source]与Session[SOURCE]是一样的如果删掉其中一个会有意想不到的结果
Cookie状态: Coolkie 状态一是用来保存一个用户资源的状态和Session不同的是它存储在浏览器端在Cookie中只能含有较少的信息通常不超过个字节(有些较新的浏览器可以达到个i字节)在ASPNET中Session对象和Cookie对象现结合来识别用户每当用户开始连接站点时系统将自动在内存块中创建一个和用户有关的Session对象同时创建一个Cookie对象来保存用户ID并把它保存在浏览器端与当前的用户唯一的联系起来这样当用户下一次在访问时用户被要求提交用户的TD也就是CooKieCookie和Session相对照以正确的还原原来的会话状态这就是无状态协议Http条件下保持用户状态的方法
向浏览器写入Cookie的方法是这样的举个例子
HttpCookie cookie=new HttpCookie(userNameId);//创建一个Cookie对象并且赋值cookieValue=userNameId//如果已经存在一Cookie也可以这样给它赋值
cookieExpires=DateTimeNow+TimeSpan;//设定cookie的生命周期
这里的TimeSpan是TimeSpan类的一个实例cookie的默认时间是分钟
ResponseCookiesAdd(cookie);//向浏览器中写入Cookie
HttpCookie cookie=RequestCookies[cookie];//读取Cookie