当前位置: 移动技术网 > IT编程>开发语言>.net > [Asp.Net]状态管理(Session、Application、Cache)

[Asp.Net]状态管理(Session、Application、Cache)

2018年09月13日  | 移动技术网IT编程  | 我要评论

平板电脑代理,镜辟天,马六甲生态板

服务器端的状态管理

 

session

      会话状态与会话相关。客户在服务器上第一次打开asp.net页面时,会话就开始了。当客户在20分钟之内没有访问服务器,会话结束,销毁session。

 

      可以在global application类(即全局应用程序类)中定义自己的代码,会话开始或结束时运行。会创建global.asax文件。在这个文件中,定义了一些时间处理程序例程:

 

 view code

      会话状态可以存储在httpsessionstate对象中。与当前http环境相关的会话状态对象可以使用page类的session属性来访问。在session_start()事件处理程序中,可以初始化会话变量。在下面的实例中,名为mydata的会话状态被初始化为0:

 

1  protected void session_start(object sender, eventargs e)

2         {

3             session["mydata"] = 0;

4         }

      可以在页面中通过使用会话状态名读取会话状态。

 

 

1  protected void unnamed2_click(object sender, eventargs e)

2         {

3             int val = (int)session["mydata"];

4             mylabel.text = val.tostring();

5             val += 5;

6             session["mydata"] = val;

7         }

 

      要把客户端与其会话变量关联起来,asp.net默认使用一个临时cookie和一个会话标识符(sessionid)。asp.net也支持没有cookie的会话,其中的url标识符用于把http请求映射到同一个会话。  

 

      session的销毁:

 

session.abandon();//销毁服务器端的session对象

session.clear();//清空服务端的session对象里的键值对,session对象并没有从session池里销毁

session常用属性、方法

 

属性 描述

sessionid

唯一用户会话标识符

 

timeout

 

用户超时(单位:分钟),默认20分钟

 

count

 

会话状态集合中的项目数

 

 

方法

 

描述

 

abandon方法

 

用于显式结束会话。

 

 

       session的作用 就像你的银行账户,钱(数据)都存在银行里,你就拿一张银行卡(包含sessionid)回家,你每次去银行取钱,只需要带着银行卡(包含sessionid)就可以了。银行就知道该将哪个账户的钱(数据)给你。而不是别人账户里的。每次取钱必须带着卡才行,所以浏览器的每次请求,也必须带着sessionid取数据。

 

session总结

 

      (之前笔记中摘录别人的一段,很容易理解,作者如果看到望指出,我将链接添加到文章中。)

 

session提供了一种把信息保存在服务器内存中的一种方式。它能存储任何数据类型包括自定义对象。所以像session["user"]的返回类型是object类型。根据你想要的类型,需要进行类型转换。

每个客户端的session是独立存储(sessionid唯一标识)。

session 对象用于存储有关用户的信息(比如在验证用户是否登录,此时可以通过判断session[“user”]是否为null进行判断)。

在整个用户会话过程中都会保留此信息。(保存sessionid的cookie丢失之前)

当用户在应用程序中从一个网页浏览到另一个网页时,存储在 session 对象中的变量不会被丢弃。(这里就感觉像全局变量了)

session只可由该会话的用户访问(因为sessionid以cookie的方式保存访问者浏览器的缓存里,关闭浏览器就没了)

用户不能访问或修改他人的session(sessionid唯一标识)

asp.net已经内置了session机制。不要放太多的对象到session(因为存储在服务器端的一个辅助进程里,不稳定,数据多了容易丢失。),session会有超时销毁的机制。

cookie是存在客户端,session是存在服务器端,目的是一样的:保存和当前客户端相关的数据(当前网站的任何一个页面都能取到session、cookie)。

如果浏览器禁用了cookie可以启用url来传递sessionid。

可以看到session机制并不是http协议规定的,是asp.net实现的,现在php、jsp等大部分服务端技术都实现了session,原理都差不多。

session有自动销毁机制(设置失效时间,默认就是滑动过期机制),如果一段时间内浏览器没有和服务器发生任何的交互,则session会定时销毁。

注意:当会话过期或终止时,服务器就会清除 session 对象

 

关于sesiion的存储方式:https://www.cnblogs.com/zhangkai2237/archive/2012/03/22/2410890.html可以看这个文章写的不错。这里就不再赘述了。

 

2.application

 

      字面翻译:应用程序状态,如果数据应在多个客户端共享,就可以使用应程序状态来保存。应用程序状态的使用方式跟session非常相似。对于应用程序状态,应使用httpapplication类,通过page类的application属性就可以访问它。

 

      application可以用来统计访问网站的人数,在启动web应用程序时,初始化应用程序变量usercount。application_start()是global.asax文件中的时间处理程序方法,在启动网站的第一个asp.net页面时调用该方法。

 

1 void application_start(object sender,eventargs e)

2 {

3     application["usercount"]=0;

4 }

      在session_start()事件处理程序中,应用程序变量usercount的值会递增。在改变应用程序变量之前,应用程序对象必须用lock()方法锁定,否则会出现线程问题,因为多个用户可以同时访问一个应用程序变量。在改变了应用程序变量的值后,还必须调用unlock()方法。注意锁定和解锁时间的时间比较短,在此时间段内,不应读文件或中的数据。否则,其他用户就必须等到数据访问完成之后才能操作。

     还用取钱的例子打比方:application的方式比较像去自动取款机取钱的模式,你进去取钱,需将门关上(lock),你取完钱出来(unlock),下一个人才能进去。这样更容易理解。

 

  protected void session_start(object sender, eventargs e)

        {

            application.lock();

            application["usercount"] = (int)application["usercount"] + 1;

            application.unlock();

        }

      读取应用程序状态中的数据与session状态中的数据一样。

 

 label1.text=application["usercount"].tostring();

     注意:不要在应用程序状态中存储太多的数据,因为应用程序状态需要服务器资源,直到服务器停止或重启之后,才会释放这些资源。

 

     3.cache

 

     高速缓存是服务端状态,它类似于应用程序状态,因为它在所有的客户端上共享。高速缓存与应用程序状态的区别是,高速缓存要灵活的多:定义状态合适失效有很多方式。我们不是给每个请求读取文件或数据库,而是把数据存储在高速缓存中。

 

     对高速缓存,需要使用system.web.caching命名控件和cache类。给高速缓存添加对象的过程如下:

 

cache.add("mycache",myobj,null,datetime.maxvalue,timespan.fromminutes(10),cacheitempriority.normal,null);

    page类的cache属性返回一个cache对象。使用cache类的add()方法,可以把任意对象赋予高速缓存。add()的第一个参数定义了高速缓存项的名字。第二个参数是应被高速缓存的对象。第三个参数定义了依赖关系,例如高速缓存项可以依赖于一个文件:当文件改变时,高速缓存对象就会失效。在下面的示例中,没有定义依赖关系,因为这个参数设置为null。

     第4和5个参数用于设置高速缓存项的有效时间。第四个参数定义了高速缓存项失效的绝对时间,第五个参数定义了使高速缓存项失效的相对时间。在这个时间过后,就不能访问高速缓存项了。下面的示例使用了相对时间,在高速缓存项试用了10分钟之后失效。

 

     第六个参数定义了高速缓存的优先级。cacheitempriority是一个设置高速缓存优先级的枚举。如果.net工作进程有很高的内存利用率,asp.net运行库就根据优先级删除高速缓存项。优先级较低的项先删除。最后一个参数定义一个方法,在删除高速缓存项时调用该方法。当高速缓存依赖于一个文件时,就可以使用最后一个参数:当文件改变时,就删除高速缓存项,调用事件处理程序。通过这个事件处理程序,可以再次读取文件,重新加载高速缓存。

 

     使用前面介绍的索引符和会话状态或应用程序状态,就可以读取高速缓存项。在使用从cache属性返回的对象之前,必须检查结果是否为null,当高速缓存失效时,结果就是null。如果从cache索引符返回的值不是null,就可以对返回的对象进行类型转换,用于存储高速缓存项:

 

 

 1 object o=cache["mycahce"];

 2 if (o==null)

 3 {

 4      //缓存里没数据 或者数据变化 重新获取数据放入缓存

 5 }

 6 else

 7 {

 8     //从缓存中取数据

 9      myclass myobj=o as myclass;

10 }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网