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



本文转自武沛齐博客园博客,原文链接:http://www.cnblogs.com/wupeiqi/archive/2012/11/14/2770587.html,如需转载请自行联系原作者



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 读取三级分类,php excel 导入 导入三级分类 表格应该怎么设计才能得到想要的数据格式?汗血宝马...

array (size16)0 >array (size7)0 > float 11 > string 销售部 (length9)2 > string 销售1区 (length10)3 > string 销售1科室 (length13)4 > null5 > null6 > null1 >array (size7)0 > float 21 > null2 > null3 > string 销售2科室 (…

ABP会臃肿吗?

有了ABP,还要学其他的框架?我有时候在想在JAVA领域,Spring基本一统天下,新手也好,高手也罢都在学习、研究和项目实战。也就是说其实对与应用开发,Spring已经是绕不开的框架,不管是单体还是微服务…

python如何正则匹配浮点值_Python正则表达式字符串数组到浮点数组

我是python正则表达式的初学者.我达到了我所需要的,但是由于缺少经验,这真的很丑.我的目标是转换以下形式的字符串数组:notes ["10.0% higher", "5.0% lower", "Same as", "21.2% lower"]到一个float数组,这样上面的数组将…

php stripslashes 去除反斜线

stripslashes可以去除反斜线&#xff0c;准确的说是去掉一个反斜线&#xff0c;因为如果是两个反斜线的话stripslashes会把两个反斜线替换成一个&#xff1a; 引用php手册的例子&#xff1a; <?php $str "Is your name O\reilly?";// 输出: Is your name Ore…

HTML5 播放器

随着 HTML5 的普及&#xff0c;越来越多视频网站使用 <video></video> 标签播放直播、点播内容&#xff08;如下图所示&#xff09;。使用 <video> 的好处&#xff0c;主要以下两点。 可以直接在页面中播放&#xff0c;也就是所谓的“区域播放”&#xff0c;…

linux shell之控制台打印各种颜色字体和背景

1 问题 控制台打印各种颜色字体和背景 字体颜色 #30:黑 #31:红 #32:绿 #33:黄 #34:蓝色 #35:紫色 #36:深绿 #37:白色 背景颜色 #40:黑 #41:深红 #42:绿 #43:黄色 #44:蓝色 #45:紫色 #46:深绿 #47:白色 echo -e "\e[43;35m chenyu\e[0m hello word&quo…

修改GIT的user.name和user.email

为什么80%的码农都做不了架构师&#xff1f;>>> $ git config --global --replace-all user.email "输入你的邮箱" $ git config --global --replace-all user.name "输入你的用户名" ----验证是否修改成功---- $ git config --list 转载…

python包实际怎么使用_Python--模块与包

模块1、什么是模块&#xff1f;一个模块就是一个Python文件&#xff0c;文件名就是模块名字加上.py后缀。因此模块名称也必须符合变量名的命名规范。1 使用python编写的代码(.py文件)2 已被编译为共享库或DLL的C或C扩展3 包好一组模块的包4 使用C编写并链接到python解释器的内置…

php获取虚拟机ip,php如何获取用户的ip地址

直接上代码/*** 获取客户端IP地址*/function real_ip(){$ip $_SERVER[REMOTE_ADDR];if (isset($_SERVER[HTTP_X_FORWARDED_FOR]) && preg_match_all(#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s,$_SERVER[HTTP_X_FORWARDED_FOR], $matches)) {foreach ($matches[0] AS $xi…

sql distinct 去重复 (mysql)

DISTINCT 去重复 &#xff08;运动扭伤腰。。。悲伤。。。 (▼ _ ▼) &#xff09; 首先&#xff0c;例如我们的表&#xff1a; 首先观察表&#xff1a; 其中第二行和第三行和第八行的name1的只是重复的&#xff0c;但第八行的age1确是12&#xff0c;与第二行和第三行不同…

如何5分钟上手使用OCR

随便打开一个Microsoft Visual Studio&#xff0c;新建一个WinForms项目&#xff0c;从下面列表中随便选择一个NET框架。net35;net40;net45;net451;net452;net46;net461;net462;net47;net471;net472;net48; netstandard2.0;netcoreapp3.1; net5.0;net6.0;创建完窗口后&#xff…

GDI与OpenGL与DirectX之间的区别

图形编程的几种技术对比&#xff1a; GDI&#xff0c;图形设备接口&#xff0c;MS开发的通用的windows系统图形编程接口&#xff0c;功能强涉及面广&#xff0c;一般的编程都用它。但是用来做多媒体开发就差强人意了 OPENGL是SGI开发的一套三维图形软件包&#xff0c;出现很早&…

HDU 5238 Calculator 线段树 中国剩余定理

题意&#xff1a; 给一个计算器&#xff0c;有一系列计算步骤&#xff0c;只有加&#xff0c;乘&#xff0c;幂三种运算。 有一种查询操作&#xff1a;查询初始值为\(x\)的时候&#xff0c;最终运算结果模\(29393\)的值。 有一种修改操作&#xff1a;可以修改第\(p\)个运算的运…

linux shell之把文本里面的;替换成\n格式输出

1 问题 一个文本里面很多中间很多&#xff1b;然后&#xff0c;现在需要把&#xff1b;替换成\n,然后换行打印出来 比如文件1.txt namechenyu;sexman;age27 我们可以用tr命题替换&#xff0c;第一个参数是需要替换的内容&#xff0c;第二个参数是将要替换的内容 2 实现 ca…

利用Excel VBA批量计算气象数据多个台站多年来春季和冬季降水量和平均气温

气象数据是地理数据的重要组成部分,存储量虽然不大,但是处理过程非常繁琐,长时序数据更不用说。本文总结了一个气象数据的基本处理方法。 如下图所示,气象数据的排列格式是区站号→年→月→降水量→平均气温,时间范围为1983~2012年,每一年都有台站数300多个,下面按区站…

VMware Workstation 12新建虚拟机

1、点击“创建新的虚拟机”2、选择“自定义”(初学选择典型也可以)&#xff0c;下一步3、默认&#xff0c;直接下一步4、通常都是先创建虚拟机&#xff0c;等虚拟机创建完成后再来安装操作系统&#xff0c;若安装过程出现什么问题方便解决&#xff0c;故选择“稍后安装操作系统…

sql count用法_SQL学习笔记3:count(*)函数

1.count(*)函数用法COUNT(*) 函数返回表中的记录数&#xff0c;具体来说&#xff0c;返回值是一个数字。语法&#xff1a;返回表中所有记录的数量&#xff1a;SELECT COUNT(*) FROM table_name返回表中满足一定条件的记录的数量&#xff1a;SELECT COUNT(*) FROM table_name WH…

sql order by,desc和limit使用(mysql)

(&#xff61;ŏ_ŏ) 首先我们来看一个表&#xff1a; 在此我们要进行排序&#xff0c;按降序排序&#xff0c;就是从大到小。然后我们只要查询前2条数据。 意思就是我们需要把这个表从大到小排序后&#xff0c;取前两条&#xff0c;那么我们就需要使用到order by 和desc …

Blazor University (13)组件 — 多线程渲染

原文链接&#xff1a;https://blazor-university.com/components/multi-threaded-rendering/多线程渲染由于 Blazor Server 应用程序中可用的线程不止一个&#xff0c;因此完全有可能不同的组件可以让不同的线程在其上执行代码。这在基于异步任务的操作中最常见。例如&#xff…

【Util】 时间天数增加,时间比较。

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/inforstack/article/details/46516623 public static void main(String[] args) {try {DateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Cale…