ASP.NET Session的7点熟习
%3Cp%3EASP.NET Session的使用当中我们会碰到很多的题目,那末这里我们来谈下常常出现的1些常常使用ASP.NET Session的理解:
ASP.NET Session的7点熟习之1
对值类型的变量,Session中保存的是值类型的拷贝
Session["__test0"] = 1; int i = (int)Session["__test0"]+1; int j = (int)Session["__test0"]; 结果i=2,j=1
ASP.NET Session的7点熟习之2
对援用类新的变量,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的7点熟习之3
Session周期
新的浏览器窗口启动后,开始1个新的Session,触发Global的Session_Start的调用,从第1个浏览器窗口打开的浏览器窗口不 启动新的Session。Session过期后,履行页面的提交也会触发Session_Start,即是是新的1个Session。
ASP.NET Session的7点熟习之4
调用Session
对Web Service,每个方法的调用都会启动1个Session,可以用下面的方法来使多个调用在同1个Session里
CWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfg.CookieContainer = new System.Net.CookieContainer(); CWSSyscfg是1个Web Service类,Web Service的给代理类设置CookieContainer属性,只要多个代理的CookieContainer属性是相同的值,则对这些Web Service的调用在同1个Session。可以用单例模式来实现。
ASP.NET Session的7点熟习之5
Session数占有效期
只要页面有提交活动,则Session的所有项都会保持,页面在20分钟(默许配置)内没有任何提交活动时Session会失效。Session内存储的多个数据项是整体失效的。
ASP.NET Session的7点熟习之6
Session的保存
在session中假设保存的是非序列化的类比如DataView,在用SQLServer保存Session的模式下,没法使用。查看1个类是否是是序列化的方法是,需看是否是用[Serializable]来标记了该类。
ASP.NET Session的7点熟习之7
关于Sesson的清除。
假设我在Session中保存1个比较大的DataSet,这样aspnet_wp.exe占有的内存会很大,假设我退出了使用这个DataSet 的页面,我想开释该Session,我用Session.Clear() 或DataSet.Clear()都 不能使内存的占用降下来,即使Session过了期限,内存也没有降下来,比较困惑,谁能给我具体解释1下。
要说到session这个东西,很多人可能都不屑1顾。这个东东嘛,n年前就开始做了,有啥好讲的啊。可是,在很多地方我们还是会发现1些题目,比 如有的人说,我的session_start激起了,怎样session_end没有啊,我在session_end做了些善后工作,这下没法完成了,怎 么办啊?
最近看了些文章,结合自己的1些经验,想和大家1起讨论1下其中的说法。
实在,很多这类的题目都是由1个东西引发的,它就是session ID。首先,是否是我1个IE client起来,访问1个页面,只要我不关浏览器,session ID就是1样的呢?很多人会想,应当是1样的吧,我浏览器都没关,web server总回会以为我是同1个client,不会把session ID变来变往的。要验证这个,让我们现在做1个简单的实验。用vs.net创建1个简单的asp.net web app.在web form1上加个button,然后在页面的page prefix上enable trace.接下来浏览这个页面,不停的click button来提交request。感谢asp.net的这个trace功能,我们可以看到session ID实在是在不停的变化的。也就是说,这时候候在服务器端,根本就不关心这个client的存在,每次都觉得它是来自1个新的client.
那这究竟是怎样回事呢?OK,让我们在page_load里面加上1句,session["variable1"]="testvalue";然后 再做1下测试。Bingo,现在session ID就保持1致了。我想,很多人或许之前就没有留意到这点。这里我们可以得出1个结论:要建立1个延续的session,我们需要最少使用1下 session变量,用行话来讲,就是要最少往session dictionary中写进1次。
不过,值得留意的是,这只是个必要条件,还不是充分条件。
在提到下1个必要条件前,我们先来弄清1件事,假设我们在程序中间有global.asax,里面有session_onstart, session_onend,上面的实验是不会成功的。缘由是1旦定义了session_onstart处理函数后,session的state就总是会 被保存了,即使里面是空的,这样的话,session ID就不会改变了。由于session这东西还是消耗资源的,所以在asp.net web app中假设没有必要,你就不要把session_onstart, session_end写在global.asax中。
上面的实验中,我们也能够看到,假设session ID在变化,我们就跟踪不到session_onend,1旦稳定下来,session_onend就出现了。
现在,我们再来谈谈另1个条件,还是先从实验做起,我们在刚才例子的基础上(包括session_onstart, session_onend),在page_load的session那行的下面加上1句,session.abandon().再来运行1把,咦,这是 你会发现1点希奇的地方,session_onend不履行了,虽然session_onstart履行过了1遍。(这里我们需要写1些log语句来视察 到)而且,假设我们把session.abandon()写在button.onclick事件里面,session_onend就立马履行了。希奇吧, 这里有甚么辨别呢?
这样,第2个必要条件就引发了,要让session_onend成功履行,最少要有1个request已被完全地履行过。上面的第1种情况,在page_load中就中断的话,第1个request都没有履行终了,session_onend就没法激起了。
综合这两个必要条件,我们终究可以得出要让session_onend履行的充分条件了:
◆最少有1个request成功完全地履行
◆最少存储1些data在session state中。可以通过session变量或加上session_onstart来实现。
最后声明1点,session_onend只在InProc模式中支持,也就是说,只在session data在asp.net worker process中时支持。
ASP.NET Session的7点熟习就谈到这里,对ASP.NET Session的理解是否是有所帮助呢?(来源:杰之蓝)
唐山网站建设www.fw8.net%3C%2Fp%3ETAG:浏览器,页面,都会,变量,必要条件
评论加载中...
|