ASPNET Session的使用当中我们会遇到很多的问题那么这里我们来谈下经常出现的一些常用ASPNET Session的理解
ASPNET Session的七点认识之一
对于值类型的变量Session中保存的是值类型的拷贝
Session["__test"] = ; int i = (int)Session["__test"]+; int j = (int)Session["__test"]; 结果i=j=
ASPNET Session的七点认识之二
对于引用类新的变量Session中保存的是引用
CDACommon cda = new CDACommon(); Session["__test"] = cdaGetDataSet("select top * from tb_customer"); DataSet ds = (DataSet)Session["__test"]; DataSet ds = (DataSet)Session["__test"]; dsTables[]Rows[][]=""; 结果dsTables[]Rows[][]=="" dsTables[]Rows[][]=="";
ASPNET Session的七点认识之三
Session周期
新的浏览器窗口启动后开始一个新的Session触发Global的Session_Start的调用从第一个浏览器窗口打开的浏览器窗口不 启动新的SessionSession过期后执行页面的提交也会触发Session_Start等于是新的一个Session
ASPNET Session的七点认识之四
调用Session
对于Web Service每个方法的调用都会启动一个Session可以用下面的方法来使多个调用在同一个Session里
CWSSyscfg cwsCfg = new CWSSyscfg(); cwsCfgCookieContainer = new SystemNetCookieContainer(); CWSSyscfg是一个Web Service类Web Service的给代理类设置CookieContainer属性只要多个代理的CookieContainer属性是相同的值则对这些Web Service的调用在同一个Session可以用单例模式来实现
ASPNET Session的七点认识之五
Session数据有效期
只要页面有提交活动则Session的所有项都会保持页面在分钟(默认配置)内没有任何提交活动时Session会失效Session内存储的多个数据项是整体失效的
ASPNET Session的七点认识之六
Session的保存
在session中如果保存的是非序列化的类比如DataView在用SQLServer保存Session的模式下无法使用查看一个类是否是序列化的方法是需看是否用[Serializable]来标记了该类
ASPNET Session的七点认识之七
关于Sesson的清除
如果我在Session中保存一个比较大的DataSet这样aspnet_wpexe占有的内存会很大假如我退出了使用这个DataSet 的页面我想释放该Session我用SessionClear() 或者DataSetClear()都 不能使内存的占用降下来即使Session过了期限内存也没有降下来比较困惑谁能给我详细解释一下
要说到session这个东西很多人可能都不屑一顾这个东东嘛n年前就开始做了有啥好讲的啊可是在很多地方我们还是会发现一些问题比 如有的人说我的session_start激发了怎么session_end没有啊我在session_end做了些善后工作这下没法完成了怎 么办啊?
最近看了些文章结合自己的一些经验想和大家一起讨论一下其中的说法
其实很多这类的问题都是由一个东西引起的它就是session ID首先是不是我一个IE client起来访问一个页面只要我不关浏览器session ID就是一样的呢?很多人会想应该是一样的吧我浏览器都没关web server总归会认为我是同一个client不会把session ID变来变去的要验证这个让我们现在做一个简单的试验用vsnet创建一个简单的aspnet web app在web form上加个button然后在页面的page prefix上enable trace接下来浏览这个页面不停的click button来提交request感谢aspnet的这个trace功能我们可以看到session ID其实是在不停的变化的也就是说这时候在服务器端根本就不关心这个client的存在每次都觉得它是来自一个新的client
那这到底是怎么回事呢?OK让我们在page_load里面加上一句session["variable"]="testvalue";然后 再做一下测试Bingo现在session ID就保持一致了我想很多人也许以前就没有注意到这点这里我们可以得出一个结论:要建立一个持续的session咱们需要至少使用一下 session变量用行话来说就是要至少往session dictionary中写入一次
不过值得注意的是这只是个必要条件还不是充分条件
在提到下一个必要条件前我们先来弄清一件事如果我们在程序中间有globalasax里面有session_onstart session_onend上面的实验是不会成功的原因是一旦定义了session_onstart处理函数后session的state就总是会 被保存了即使里面是空的这样的话session ID就不会改变了因为session这东西还是消耗资源的所以在aspnet web app中如果没有必要你就不要把session_onstart session_end写在globalasax中
上面的实验中我们也可以看到如果session ID在变化我们就跟蹤不到session_onend一旦稳定下来session_onend就出现了
现在我们再来谈谈另一个条件还是先从实验做起我们在刚才例子的基础上(包括session_onstart session_onend)在page_load的session那行的下面加上一句sessionabandon()再来运行一把咦这是 你会发现一点奇怪的地方session_onend不执行了尽管session_onstart执行过了一遍(这里我们需要写一些log语句来观察 到)而且如果我们把sessionabandon()写在buttononclick事件里面session_onend就立马执行了奇怪吧 这里有什么区别呢?
这样第二个必要条件就引发了要让session_onend成功执行至少要有一个request已经被完整地执行过上面的第一种情况在page_load中就中止的话第一个request都没有执行完毕session_onend就没法激发了
综合这两个必要条件我们终于可以得出要让session_onend执行的充分条件了
◆至少有一个request成功完整地执行
◆至少存储一些data在session state中可以通过session变量或者加上session_onstart来实现
最后声明一点session_onend只在InProc模式中支持也就是说只在session data在aspnet worker process中时支持
ASPNET Session的七点认识就谈到这里对于ASPNET Session的理解是不是有所帮助呢?(来源杰之蓝)