ASP.NET Session的使用当中咱们会遇到不少的问题,那么这里咱们来谈下常常出现的一些经常使用ASP.NET Session的理解:浏览器
对于值类型的变量,Session中保存的是值类型的拷贝服务器
结果i=2,j=1session
对于引用类新的变量,Session中保存的是引用函数
结果ds.Tables[0].Rows[0][0]=="9999" ds2.Tables[0].Rows[0][0]=="9999";测试
Session周期spa
新的浏览器窗口启动后,开始一个新的Session,触发Global的Session_Start的调用,从第一个浏览器窗口打开的浏览器窗 口不启动新的Session。Session过时后,执行页面的提交也会触发Session_Start,等因而新的一个Session。代理
调用Sessioncode
对于Web Service,每一个方法的调用都会启动一个Session,能够用下面的方法来使多个调用在同一个Session里orm
CWSSyscfg是一个Web Service类,Web Service的给代理类设置CookieContainer属性,只要多个代理的CookieContainer属性是相同的值,则对这些Web Service的调用在同一个Session。能够用单例模式来实现。blog
Session数据有效期
只要页面有提交活动,则Session的全部项都会保持,页面在20分钟(默认配置)内没有任何提交活动时Session会失效。Session内存储的多个数据项是总体失效的。
Session的保存
在Session中若是保存的是非序列化的类好比DataView,在用SQLServer保存Session的模式下,没法使用。查看一个类是不是序列化的方法是,需看是否用[Serializable]来标记了该类。
关于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的理解是否是有所帮助呢?