zoukankan      html  css  js  c++  java
  • ASP.NET Session的七点认识(转)

     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://www.52cfml.com/post/104.html

  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/wupeiqi/p/2770587.html
Copyright © 2011-2022 走看看