当前位置:首页 > 编程学习 > ASP.NET Session的七点认识

ASP.NET Session的七点认识

编程学习2012-08-1827660

  ASP.NET  Session的使用当中我们会遇到很多的问题,那么这里我们来谈下经常出现的一些常用ASP.NET Session的理解:

  • ASP.NET  Session的七点认识之一

  对于值类型的变量,Session中保存的是值类型的拷贝

Session["__test0"] =1; 
int i = (int)Session["__test0"]+1; 
int j = (int)Session["__test0"];

  结果i=2,j=1


  • ASP.NET  Session的七点认识之二

  对于引用类新的变量,Session中保存的是引用

CDACommon  cda =new CDACommon(); 
Session["__test"] = cda.GetDataSet("select  top 1 * from tb_customer"); 
DataSet  ds = (DataSet)Session["__test"]; 
DataSet  ds2 = (DataSet)Session["__test"]; 
ds.Tables[0].Rows[0][0]="9999";

  结果ds.Tables[0].Rows[0][0]=="9999"  ds2.Tables[0].Rows[0][0]=="9999";


  • ASP.NET  Session的七点认识之三

  Session周期

  新的浏览器窗口启动后,开始一个新的Session,触发Global的Session_Start的调用,从第一个浏览器窗口打开的浏览器窗口不启动新的Session。Session过期后,执行页面的提交也会触发Session_Start,等于是新的一个Session。

  • ASP.NET  Session的七点认识之四

  调用Session

  对于Web  Service,每个方法的调用都会启动一个Session,可以用下面的方法来使多个调用在同一个Session里

CWSSyscfg  cwsCfg = new CWSSyscfg(); 
cwsCfg.CookieContainer = new System.Net.CookieContainer();

  CWSSyscfg是一个Web  Service类,Web  Service的给代理类设置CookieContainer属性,只要多个代理的CookieContainer属性是相同的值,则对这些Web  Service的调用在同一个Session。可以用单例模式来实现。

  • ASP.NET  Session的七点认识之五

  Session数据有效期

  只要页面有提交活动,则Session的所有项都会保持,页面在20分钟(默认配置)内没有任何提交活动时Session会失效。Session内存储的多个数据项是整体失效的。

  • ASP.NET  Session的七点认识之六

  Session的保存

  在Session中如果保存的是非序列化的类比如DataView,在用SQLServer保存Session的模式下,无法使用。查看一个类是否是序列化的方法是,需看是否用[Serializable]来标记了该类。

  • ASP.NET  Session的七点认识之七

  关于Sessuon的清除

  如果我在Session中保存一个比较大的DataSet,这样aspnet_wp.exe占有的内存会很大,假如我退出了使用这个DataSet  的页面,我想释放该Session,我用Session.Clear()  或者DataSet.Clear()都不能使内存的占用降下来,即使Session过了期限,内存也没有降下来,比较困惑,谁能给我详细解释一下。

  要说到session这个东西,很多人可能都不屑一顾。这个东东嘛,n年前就开始做了,有啥好讲的啊。可是,在很多地方我们还是会发现一些问题,比如有的人说,我的session_start激发了,怎么session_end没有啊,我在session_end做了些善后工作,这下没法完成了,怎么办啊?

  最近看了些文章,结合自己的一些经验,想和大家一起讨论一下其中的说法。

  其实,很多这类的问题都是由一个东西引起的,它就是Session  ID。首先,是不是我一个IE client起来,访问一个页面,只要我不关浏览器,Session  ID就是一样的呢?很多人会想,应该是一样的吧,我浏览器都没关,Web Server总归会认为我是同一个client, 不会把Session  ID变来变去的。要验证这个,让我们现在做一个简单的试验。用VS.NET创建一个简单的ASP.NET Web App. 在Web Form1上加个Button,  然后在页面的Page Prefix上enable trace. 接下来浏览这个页面,不停的click  button来提交Request。感谢ASP.NET的这个trace功能,我们可以看到Session  ID其实是在不停的变化的。也就是说,这时候在服务器端,根本就不关心这个client的存在,每次都觉得它是来自一个新的client.

  那这到底是怎么回事呢?OK,让我们在Page_Load里面加上一句,Session["variable1"]="testvalue";然后  再做一下测试。Bingo, 现在Session  ID就保持一致了。我想,很多人也许以前就没有注意到这点。这里我们可以得出一个结论:要建立一个持续的Session,咱们需要至少使用一下Session变量,用行话来说,就是要至少往Session  Dictionary中写入一次。

  不过,值得注意的是,这只是个必要条件,还不是充分条件。

  在提到下一个必要条件前,我们先来弄清一件事,如果我们在程序中间有Global.asax,里面有Session_OnStart,  Session_OnEnd,上面的实验是不会成功的。原因是一旦定义了Session_OnStart处理函数后,Session的state就总是会被保存了,即使里面是空的,这样的话,Session  ID就不会改变了。因为Session这东西还是消耗资源的,所以在ASP.NET Web App中如果没有必要,你就不要把Session_OnStart,  Session_End写在Global.asax中。

  上面的实验中,我们也可以看到,如果Session  ID在变化,我们就跟踪不到Session_OnEnd, 一旦稳定下来,Session_OnEnd就出现了。

  现在,我们再来谈谈另一个条件,还是先从实验做起,我们在刚才例子的基础上(包括Session_OnStart,  Session_OnEnd),在Page_Load的Session那行的下面加上一句,Session.Abandon().  再来运行一把,咦,这时你会发现一点奇怪的地方,  Session_OnEnd不执行了,尽管Session_OnStart执行过了一遍。(这里我们需要写一些log语句来观察到)而且,如果我们把Session.Abandon()写在Button.OnClick事件里面,Session_OnEnd就立马执行了。奇怪吧,  这里有什么区别呢?

  这样,第二个必要条件就引发了,要让Session_OnEnd成功执行,至少要有一个Request已经被完整地执行过。上面的第一种情况,在Page_Load中就中止的话,第一个Request都没有执行完毕,Session_OnEnd就没法激发了。

  综合这两个必要条件,我们终于可以得出要让Session_OnEnd执行的充分条件了:

  ◆  至少有一个Request成功完整地执行

  ◆  至少存储一些data在Session State中。可以通过Session变量或者加上Session_OnStart来实现。

  最后声明一点,Session_OnEnd只在InProc模式中支持,也就是说,只在Session  Data在ASP.NET worker process中时支持。

  ASP.NET  Session的七点认识就谈到这里,对于ASP.NET  Session的理解是不是有所帮助呢?

转自:http://kb.cnblogs.com/page/108689/

扫描二维码推送至手机访问。

版权声明:本文由海阔天空发布,如需转载请注明出处。

本文链接:https://www.apull.net/html/20120818233.html

分享给朋友:

相关文章

VB/VB.net 只允许运行一个实例

VB/VB.net 只允许运行一个实例

VB/VB.net  只允许运行一个实例       by:  Apull  VB中的实现方法VB如何防止程序被重复加载,也就是只允许运行一个实例,一般有2种方法。一,直接用VB提供的APP对象的PrevInstance方法。PrevInstance的返回值为True则说明已经有一个实力在运行。If App.PrevInstance Then Msgbox "已经有一个实例在运行" End if这个...

致面向对象技术初学者的一封公开信

致面向对象技术初学者的一封公开信

 致面向对象技术初学者的一封公开信 Alistair Cockburn 著(1996 年2 月),袁峰 译介绍 首先我要解释一下为什么会写这封公开信。这似乎已经成了一种习惯,但这个步骤还是需要的。过去6 年中, 我曾经无数次地在饭店、酒吧、旅店大厅等各种地方以同一种方式度过愉快而漫长的夜晚:和同样追求真理、光明和智慧的伙伴一起探讨面向对象的真谛。现在,我已经可以回答很多当年我遇到的问题。这些同样的问题也在困扰着我的一位新同事,在一家饭店里,我花了整整一个晚上和他讨...

计算机蓝屏代码的含义

计算机蓝屏代码的含义

0 0x0000 作业完成。1 0x0001 不正确的函数。2 0x0002 系统找不到指定的档案。3 0x0003 系统找不到指定的路径。4 0x0004 系统无法开启档案。5 0x0005 拒绝存取。6 0x0006 无效的代码。7 0x0007 储存体控制区块已毁。8 0x0008 储存体空间不足,无法处理这个指令。9 0x0009 储存体控制区块地址无效。10 0x000A 环境不正确。11 0x000B 尝试加载一个格式错误的程序。12 0x000C 存取码错误。1...

ASP错误提示大全

ASP错误提示大全

Microsoft VBScript 语法错误(0×800A03E9)–>内存不足Microsoft VBScript 语法错误(0×800A03EA)–>语法错误Microsoft VBScript 语法错误(0×800A03EB)–>缺少’:’Microsoft VBScript 语法错误(0×800A03ED)–>缺少’(’Mi...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。