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的七点认识之七

关于Sesson的清除。

如果我在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的理解是不是有所帮助呢?

(0)

相关推荐

  • 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 CDAC

  • asp.net session丢失的解决方法小结

    现在我就把原因和解决办法写出来. ASP.NET Session丢失原因: 由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下: < sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' time

  • asp.net session的使用与过期实例代码

    1.Session是一种Web会话中的常用状态之一. 2.Session提供了一种把信息保存在服务器内存中的方式.他能储存任何数据类型,包含自定义对象. 3.每个客户端的Seesion是独立存储的. 4.在整个会话过程中,只要SessionID的cookie不丢失,都会保存Session信息的. 5.Session不能跨进程访问,只能由该会话的用户访问.应为提取Session数据的id标识是以Cookie的方式保存到访问者浏览器的缓存里的. 6.当会话终止,或过期时,服务器就清除Session对

  • ASP.NET Session使用详解

    Session模型简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份.这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子. 这个唯一的SessionID是有很大的实际意义的.当一个用

  • ASP.NET Session会导致的性能问题

    而且还是阵发性的,有某个用户投诉慢的时候,你访问却很快,本地又复现不出来?今天你访问了博客园真是太幸运了,也许这里就有你想要的一个答案--假如你的站点动态处理了图片或者其他原本不会动态处理的非网页资源的话.没想到吧,这是Session惹的祸! 我们公司某个站点访问量一直很大,几年前就已经发现客户经常投诉说很慢,而这个问题我们一直都在排查和解决.从线路问题,到数据库连接泄露,到数据库死锁.索引,以及程序的优化问题,我们都查找过,并且解决过.然而,这个问题总还是存在.比如说,在IIS日志中,就会经常

  • ASP.NET session.timeout设置案例详解

    session.timeout 方法一: asp.net Session的默认时间设置是20分钟,即超过20分钟后,服务器会自动放弃Session信息. 当我们在asp.net程序中打开webconfig的时候,可以看到一段如下的代码:Asp.net程序代码: sessionState节点放在<system.web>节点下,形式如下: configuration 元素(常规设置架构) system.web 元素(ASP.NET 设置架构) sessionState 元素(ASP.NET 设置架

  • ASP.NET Session对象保持会话使用说明

    ASP.NET提供了Session对象,从而允许程序员识别.存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息.Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件:在对话超时或者被关闭的时候会触发Session_onEnd事件.程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等. 在ASP.NET的程序中要使用Session对象时,必须确

  • ASP中Session技巧 默认过期时间为20分钟

    写过稍微大型一点 ASP 的人都知道,Session 这个对象真是好用,它可以用来记录使用者私有的资料变量,既安全又方便.但是你真的知道 Session 的运作原理吗?或许了解以后,你就再也不太敢使用这个令人又爱又恨的对象.虽然转而替代之的方法稍嫌麻烦,但在长期考量之下,也就不得不这么做了 首先来讲讲 Session 的好处,它可以用来记录客户端私有的资料变量,并且在时间范围内不会消失.这真的是很重要的功能,尤其是有会员的系统必须要用到的.像是会员的登入帐号.时间.状态以及许许多多该记录的实时数

  • asp.net 页面间传值方法小结

    1.表单提交, 复制代码 代码如下: <form action= "target.aspx" method = "post" name = "form1"> <input name = "param1" value = "1111"/> <input name = "param2" value = "2222"/> </for

  • Asp.net调试的一些问题小结

    昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装,调试问题都被我碰到了,还好,我一个个把他记录下来了,同时,在CSDN找了一些相关的解决方法,不敢独享,供大家相互学习交流之用. 起因是这样的,机子运行IE时假死,我用着不爽,就二话不说热启动,结果就出事了. 重新打开正在Vs2003.Net里面正在作的项目时,老半天没反应,机子变得异常慢,当然,出于职业的敏感,马上来了个Ctrl+Alt+Del,这下不好,CPU占用100%,一直高居不下,运

随机推荐