原文:http://kb.cnblogs.com/page/108689/

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

ASP.NET Session的七点认识的更多相关文章

  1. [ASP.NET] Session的了解

    ASP.NET Session的使用当中我们会遇到很多的问题,那么这里我们来谈下经常出现的一些常用ASP.NET Session的理解: ASP.NET Session的七点认识之一 对于值类型的变量 ...

  2. ASP.NET Session 详解

    阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解.否则,阅读过程中会在相应的内容上遇到不同程度的问题. 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的Session模型 了 ...

  3. ASP.NET Session的共享

    注: 在ashx文件中使用Session 首先添加引用 using System.Web.SessionState; 实现接口 public class XXXX: IHttpHandler ==&g ...

  4. 使用SQL Server存储ASP.NET Session变量

    创建和配置ASP.NET Session状态数据库 在基于NLB(网络负载平衡)环境下的ASP.NET Web应用程序开发,我们需要将Session存储在数据库中供多个Web应用程序调用,以下为配置方 ...

  5. ASP.NET Session丢失的情况

    正常操作情况下会有ASP.NET Session丢失的情况出现.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这么快就超时的. 现在我就把原 ...

  6. [转]ASP.NET Session 详解

    来源:http://www.webshu.net/jiaocheng/programme/ASPNET/200606/1381.html 阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解 ...

  7. ASP.NET Session丢失的解决方案

    正常操作情况下会有ASP.NET Session丢失的情况出现.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这么快就超时的.现在我就把原因 ...

  8. ASP.NET Session丢失问题原因及解决方案

    正常操作情况下会有ASP.NET Session丢失的情况出现.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这么快就超时的. ASP.NE ...

  9. ASP.NET Session的实现原理分析

    ASP.NET Session的实现原理分析 用户向服务器提交请求时,服务器都会给每个用户分配一个SessionId,保存在用户浏览器的Cookies中,SessionId是全局的,也就是说只要Coo ...

随机推荐

  1. 在Ubuntu下设置环境变量

    在Ubuntu中有如下几个文件可以设置环境变量 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. /e ...

  2. [.NET] 打造防“狼”神器 :任务栏篇

    @微微一笑:本文标题纯属自娱自乐. 隐藏任务栏效果图: 对比 说起来惭愧,上面这个隐藏任务栏功能,只是完成了我一半的预想.本想是可以选择性的隐藏任务栏上的某个TaskBarButton,但是Win7+ ...

  3. WPF实现3D翻转的动画效果

    1.前端代码实现 1.1 原理见代码注析 <Grid MouseDown="Grid_MouseDown"> <Viewport3D> <Viewpo ...

  4. 《Prism 5.0源码走读》 设计模式

    Prism或Prism构建的应用程序时会使用大量的设计模式,本文简要列举Prism相关的那些设计模式. Adapter(适配器模式):Prism Library主要在Region和IoC contai ...

  5. 微软CRM解决医药企业串货之痛

    没有准确.及时的流向数据统计和分析,医药企业营销部门就无法有效管理串货泛滥问题,串货会造成渠道无利可赚,挫伤渠道的积极性,产品无人愿意卖,最终伤害的还是医药企业. 医药企业营销发展的不同阶段对串货的态 ...

  6. malloc calloc realloc,new区别联系以及什么时候用

    三个函数的申明分别是:void* realloc(void* ptr, unsigned newsize);void* malloc(unsigned size);void* calloc(size_ ...

  7. PHP中使用CURL实现GET和POST请求

    转自:http://www.smsyun.com/home-index-page-id-284.html 一.什么是CURL? cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议, ...

  8. [超简洁]EasyQ框架-应对WEB高并发业务(秒杀、抽奖)等业务

    背景介绍 这几年一直在摸索一种框架,足够简单,又能应付很多高并发高性能的需求.研究过一些框架思想如DDD DCI,也实践过CQRS框架. 但是总觉得复杂度高,门槛也高,自己学都吃力,如果团队新人更难接 ...

  9. 2.2孙鑫C++

    1.继承 动物有 吃 睡 呼吸的方法 当然 鱼也有    不用重复再定义 1)public 那里都可以访问 #include <iostream.h> class Animal //类 基 ...

  10. why does angular js rock

    angularjs 入门教程 http://angular-tips.com/blog/2013/08/why-does-angular-dot-js-rock/ Practive the previ ...