上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html。除了在客户端上保存状态外,还可以在服务器上保存状态。使用客户端的状态,其缺点在于增加了数据在网络之间的传送。使用服务器端状态的缺点在于,服务器必须给客户端分配资源,下面详细讨论服务器端的状态管理技术。

服务器端的状态管理

  1. Session

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

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

  public class Global : System.Web.HttpApplication
{ protected void Application_Start(object sender, EventArgs e)
{ } protected void Session_Start(object sender, EventArgs e)
{ } protected void Application_BeginRequest(object sender, EventArgs e)
{ } protected void Application_AuthenticateRequest(object sender, EventArgs e)
{ } protected void Application_Error(object sender, EventArgs e)
{ } protected void Session_End(object sender, EventArgs e)
{ } protected void Application_End(object sender, EventArgs e)
{ }
}

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

  protected void Session_Start(object sender, EventArgs e)
{
Session["mydata"] = ;
}

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

  protected void Unnamed2_Click(object sender, EventArgs e)
{
int val = (int)Session["mydata"];
myLabel.Text = val.ToString();
val += ;
Session["mydata"] = val;
}

要把客户端与其会话变量关联起来,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的存储方式: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页面时调用该方法。

 Void Application_Start(Object sender,EventArgs e)
{
Application["userCount"]=;
}

在Session_Start()事件处理程序中,应用程序变量userCount的值会递增。在改变应用程序变量之前,应用程序对象必须用Lock()方法锁定,否则会出现线程问题,因为多个用户可以同时访问一个应用程序变量。在改变了应用程序变量的值后,还必须调用Unlock()方法。注意锁定和解锁时间的时间比较短,在此时间段内,不应读文件或数据库中的数据。否则,其他用户就必须等到数据访问完成之后才能操作。
     还用取钱的例子打比方:Application的方式比较像去自动取款机取钱的模式,你进去取钱,需将门关上(Lock),你取完钱出来(Unlock),下一个人才能进去。这样更容易理解。

  protected void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["userCount"] = (int)Application["userCount"] + ;
Application.UnLock();
}

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

 Label1.Text=Application["userCount"].ToString();

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

3.Cache

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

对高速缓存,需要使用System.Web.Caching命名控件和Cache类。给高速缓存添加对象的过程如下:

Cache.Add("mycache",myobj,null,DateTime.MaxValue,TimeSpan.FromMinutes(),CacheItemPriority.Normal,null);

Page类的Cache属性返回一个Cache对象。使用Cache类的Add()方法,可以把任意对象赋予高速缓存。Add()的第一个参数定义了高速缓存项的名字。第二个参数是应被高速缓存的对象。第三个参数定义了依赖关系,例如高速缓存项可以依赖于一个文件:当文件改变时,高速缓存对象就会失效。在下面的示例中,没有定义依赖关系,因为这个参数设置为null。
     第4和5个参数用于设置高速缓存项的有效时间。第四个参数定义了高速缓存项失效的绝对时间,第五个参数定义了使高速缓存项失效的相对时间。在这个时间过后,就不能访问高速缓存项了。下面的示例使用了相对时间,在高速缓存项试用了10分钟之后失效。

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

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

 object o=Cache["mycahce"];
if (o==null)
{
//缓存里没数据 或者数据变化 重新获取数据放入缓存
}
else
{
//从缓存中取数据
Myclass myobj=o as Myclass;
}

      参考资料:

                  c#入门经典(第4版)及网络资源

结语:
     由于工作的原因,总是断断续续,今天终于将状态保持的几种方式整理完了。东西比较基础,从之前笔记中摘抄了一部分(觉得能让当时的自己理解的),LZ一直关注博客园,每天必看,看到的好东西总会记录在本地笔记中,这么长时间了,很多不记得来源自哪篇文章了。实在对不起原文博主的辛勤劳动,但是从他们那里吸收了不少东西,也会慢慢的整理出来,也会加入一些自己的理解。这里真心感谢大牛们的分享,你们辛苦了。

[Asp.Net]状态管理(Session、Application、Cache)的更多相关文章

  1. 转载ASP.NET 状态管理Application,Session,Cookie和ViewState用法

    转载原地址 http://www.cnblogs.com/cuishao1985/archive/2009/09/24/1573403.html ASP.NET状态管理 APPlication,Ses ...

  2. [译]面向初学者的Asp.Net状态管理技术

    介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...

  3. ASP.NET状态管理的总结

    阅读目录 开始 hidden-input QueryString Cookie ApplicationState ViewState,ControlState Session Profile 各种状态 ...

  4. c# Cookie,Session,Application,Cache 四种缓存使用情景

    好记性不如烂笔头,记录一下C#缓存使用的情景模式....个人理解,不正之处,欢迎指正 讨论 Cookie,Session,Application,Cache 四种,有的缓存情景对人,有的缓存情景对事儿 ...

  5. Unit07: 状态管理-Session

    Unit07: 状态管理-Session web package web; import java.io.IOException; import java.io.PrintWriter; import ...

  6. [Asp.Net]状态管理(ViewState、Cookie)

    简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请 ...

  7. ASP.NET状态管理详解,让你明明白白

    开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协 ...

  8. [Asp.Net]状态管理(Session、Application、Cache、Cookie 、Viewstate、隐藏域 、查询字符串)

    Session:  1. 客户在服务器上第一次打开Asp.Net页面时,会话就开始了.当客户在20分钟之内没有访问服务器,会话结束,销毁session.(当然也可以在Web.config中设置缓存时间 ...

  9. 实验五 ASP.NET状态管理和应用程序配置 总结

    这次实验内容是对ASP.NET配置系统的了解和使用,还有就是对Application.Session.ViewState对象的应用.首先,我想说ASP.NET配置系统真的大大超乎我的想象,我以为会是上 ...

随机推荐

  1. C#基础之lock

    1.lock的本质 实现线程同步的第一种方式是我们经常使用的lock关键字,它将包围的语句块标记为临界区,这样一次只有一个线程进入临界区并执行代码.下面第一段的几行代码是关于lock关键字的使用方式, ...

  2. 同步git修改文件到远端服务器脚本

    #!/usr/bin/perl -w @files=`git status -s` ; @sync_files = (); foreach (@files) { ); # 固定前2个字符为状态 + 1 ...

  3. 关于python中PIL的安装

    python 的PIL安装是一件很蛋痛的事, 如果你要在python 中使用图型程序那怕只是将个图片从二进制流中存盘(例如使用Scrapy 爬网存图),那么都会使用到 PIL 这库,而这个库是出名的难 ...

  4. 《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  5. Linq之Expression高级篇(常用表达式类型)

    目录 写在前面 系列文章 变量表达式 常量表达式 条件表达式 赋值表达式 二元运算符表达式 一元运算符表达式 循环表达式 块表达式 总结 写在前面 首先回顾一下上篇文章的内容,上篇文章介绍了表达式树的 ...

  6. MongoDB学习与BUG解答

    简单介绍: MongoDb也是NoSQL中的一种,并且是应用比较火的一门解决高效处理数据的技术. 网上说它是介于关系数据库 和非关系数据库之间的产品,它是非关系数据库中最丰富的,最像关系数据的. Q: ...

  7. android文件上传到服务器

    package uploadDemo; import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStre ...

  8. nginx 的中文配置详细解释

    文章转自:http://www.ha97.com/5194.html 更详细的模块参数请参考:http://wiki.nginx.org/Main #定义Nginx运行的用户和用户组 user www ...

  9. '$.browser.msie' 为空或不是对象

    最近决定整改一下jquery 的版本,于是就将 jquery 从 1.7.2 升级到了 1.9.1 结果就发现原有的插件报错了. '$.browser.msie' 为空或不是对象,这个是jQuery错 ...

  10. 【CodeForces 557B】Pasha and Tea

    题 题意 总共有 w 克蛋糕,2n 个盘子,第 i 个盘子容量为 ai ,n 个女孩和 n 个男孩,男孩得到的是女孩得到的蛋糕的两倍,求他们得到蛋糕的最大值. 分析 把盘子从小到大排序,然后 女生得到 ...