状态管理II(服务器端)

状态类型       位置      有效时间 
应用程序        服务器     应用程序状态在所有的客户端上共享,在这个状态在服务器重启动之前都是有效的.

高速缓存      服务器      类似于应用程序状态,高速缓存是共享的.但是,使高速缓存无效有更好的控制方式.

 

 

会话

   会话状态与浏览器会话相关,当用户在第一次打开asp.net页面时,会话就开始了.当客户在20分钟之内没有再次访问服务器时,会话结束.
   可以在Global Application 类中定义自己的代码,在会话开始或结束时运行.Golbal Application类中,定义了5个事件处理(Application_Start,Application_End,Application_Error,Session_Start,Session_End)
      会话状态可以在座在HttpSessionState对象中.与当前相关的会话状态对象可以使用Page类的Session属性来访问.使用方式如下:
//用法与ViewState差不多
//名为mydata的会话状态被初始化为0
Session["myData"] = 0;
读取会话状态
int val = (int)Session["myData"]


应用程序

如果数据应在多个客户端共享,就可以使用应用程序状态.应用程序状态的使用方式与会话状态非常类似.对于应用程序状态,使用HttpApplicationState类,通过Page类的Application属性可以访问它.
在启动Asp.NET页面时调用该方法.这个变量用于计算访问网站的用户数.
void Application_Start(Object sender,EventArgs e)
{
   Application["userCount"] = 0;
}
然后在Session_start()事件中对userCount值递增
在改变应用程序变量之前,应用程序对象必须对Lock()方法锁定,否则就会出现线程问题,因为多个人可以同时访问同一个应用程序变量.在改变完之后.还必须调用Unlock()方法解.
void Session_start(Object sender,EventArgs e)
{
    Application.Lock(); 
    Application["userCount"] = (int)Application["userCount"]+1;
    Application.UnLock();

}
读取应用程序状态中的数据与读取会话中的数据一样简单:
Lable1.Text = Application["UserCount"].ToString();
应尽量减少存放在应用程序中的数据,因为应用程序状态需要服务器资源,直到服务器停止或者重启之后,才会释放这些资源.


高速缓存

   高速缓存是服务器端状态,它类似于应用程序状态,因为它在所有的客户端上共享.高速缓存与应用程序状态的区别是,高速缓存要灵活得多:定义状态何时失效有许多方式.我们不是给每个请求读取文件或数据库,而是把数据存储在高速缓存中.
   对于高速缓存,需要使用SystemWeb,Caching命名空间和Cache类.给高速缓存添加对象的过程如下:Page类的Cache属性返回一个Cache对象.使用Cache类的Add()方法,可以把任意对象赋予高速缓存.Add()方法的第一个参数定义了高速缓存项的名称.第二个参数是应高速缓存的对象.第三个参数定义了依赖关系.例如高速缓存项可以依赖于一个文件:当文件改变时,高速缓存对象就会失效.
例:
Cache.Add("mycache",myobj,null,DateTime.MaxValue,TimeSpan,FromMinutes(10),CacheItemPriority.Normal,nukk);
上面的救命中,没有定义依赖关系,因为这个参数设置为null,第四第五个参数用于设置高速缓存项的有效时间.第四个参数定义了高速缓存项失效的绝对时间.第五个参数定义了使用高速缓存项失效的相对时间.在这个时间过后.就不能访问高速缓存了(访问时就为null),这里设置为10分钟后失效.第六个参数定义了高速缓存的优先级别,CacheItemPriority是一个设置高速缓存优先级的枚举.如果asp.net工作进程有很高的内在利用率,asp.net运行库就会根据优先级删除高速缓存项.优先级低的先删除.最后一个参数用于定义一个方法,在删除高速缓存项时调用该方法,当高速缓存依赖于一个文件时.就可以使用最后一个参数:当文件改变时,就删除高速缓存项.
读取的时候也与前面所介绍的差不多.
object o = Cache["mycache"];
if(o==null)
需要判断是否为null,在高速缓存中拿出来的数据,很可能已经失效了

posted on 2009-01-17 16:23  Ss_Andy  阅读(488)  评论(0编辑  收藏  举报