上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html。除了在客户端上保存状态外,还能够在服务器上保存状态。使用客户端的状态,其缺点在于增长了数据在网络之间的传送。使用服务器端状态的缺点在于,服务器必须给客户端分配资源,下面详细讨论服务器端的状态管理技术。html
服务器端的状态管理数据库
会话状态与浏览器会话相关。客户在服务器上第一次打开Asp.Net页面时,会话就开始了。当客户在20分钟以内没有访问服务器,会话结束,销毁session。c#
能够在Global Application类(即全局应用程序类)中定义本身的代码,会话开始或结束时运行。会建立Global.asax文件。在这个文件中,定义了一些时间处理程序例程:浏览器
1 public class Global : System.Web.HttpApplication 2 { 3 4 protected void Application_Start(object sender, EventArgs e) 5 { 6 7 } 8 9 protected void Session_Start(object sender, EventArgs e) 10 { 11 12 } 13 14 protected void Application_BeginRequest(object sender, EventArgs e) 15 { 16 17 } 18 19 protected void Application_AuthenticateRequest(object sender, EventArgs e) 20 { 21 22 } 23 24 protected void Application_Error(object sender, EventArgs e) 25 { 26 27 } 28 29 protected void Session_End(object sender, EventArgs e) 30 { 31 32 } 33 34 protected void Application_End(object sender, EventArgs e) 35 { 36 37 } 38 }
会话状态能够存储在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请求映射到同一个会话。 cookie
Session的销毁:网络
Session.Abandon();//销毁服务器端的Session对象 Session.Clear();//清空服务端的Session对象里的键值对,Session对象并无从Session池里销毁
Session经常使用属性、方法session
属性 | 描述 |
SessionID | 惟一用户会话标识符asp.net |
TimeOut |
用户超时(单位:分钟),默认20分钟 |
Count |
会话状态集合中的项目数 |
方法 |
描述 |
Abandon方法 |
用于显式结束会话。 |
Session的做用 就像你的银行帐户,钱(数据)都存在银行里,你就拿一张银行卡(包含SessionId)回家,你每次去银行取钱,只须要带着银行卡(包含SessionId)就能够了。银行就知道该将哪一个帐户的钱(数据)给你。而不是别人帐户里的。每次取钱必须带着卡才行,因此浏览器的每次请求,也必须带着sessionid取数据。
Session总结
(以前笔记中摘录别人的一段,很容易理解,做者若是看到望指出,我将连接添加到文章中。)
注意:当会话过时或终止时,服务器就会清除 Session 对象
关于Sesiion的存储方式:http://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是一个设置高速缓存优先级的枚举。若是asp.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 }
参考资料:
c#入门经典(第4版)及网络资源
结语: 因为工做的缘由,老是断断续续,今天终于将状态保持的几种方式整理完了。东西比较基础,从以前笔记中摘抄了一部分(以为能让当时的本身理解的),LZ一直关注博客园,天天必看,看到的好东西总会记录在本地笔记中,这么长时间了,不少不记得来源自哪篇文章了。实在对不起原文博主的辛勤劳动,可是从他们那里吸取了很多东西,也会慢慢的整理出来,也会加入一些本身的理解。这里真心感谢大牛们的分享,大家辛苦了。