首页 > 语言 > 关键词  > ASP.NET最新资讯  > 正文

ASP.NET Session的七点认识

2011-07-08 12:21 · 稿源:杰之蓝,www.52cfml.com/

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

关于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的理解是不是有所帮助呢?(来源:杰之蓝

  • 相关推荐
  • 大家在看
  • 新研究表明Apple Watch还能检测其他类型的心律不齐

    2017 年,斯坦福大学和苹果公司联合启动了“苹果心脏研究”(Apple Heart Study)项目。后续研究表明除了心房颤动(AFib)之外,Apple Watch 还能够检测其他类型的心律不齐。Apple Watch 目前提供潜在的心房颤动检测和通知。作为其核心健康功能之一,在其 Series 4更新中引入了心电图(ECG)传感器。“苹果心脏研究”的结果证明了该功能背后的科学性,苹果自己一直将其定位为一种更多了解你的健康和可能影响你心脏健康的潜在条件的

  • Apple Music或即将出现在PlayStation 5上

    据外媒报道,苹果在媒体流媒体大战中对Apple Music下了很大赌注,这家位于库比蒂诺的科技巨头的长期优先事项之一就是将该服务带到尽可能多的设备上。这很有意义,因为这正是媒体平台的目的所在。与此同时,这也是苹果在这个市场上的竞争对手所采取的策略,包括像Spotify和Google的YouTube Music。为此,苹果正在试图将Apple Music带给尽可能多的用户,最近,新证据最终揭示了该服务的下一个目的地之一。日前,有人在PlayStation 5?

  • Apple Music音乐服务即将登陆PlayStation 5

    自去年 11 月发售以来,PlayStation 5 的在线音乐流媒体服务主要为 Spotify,可以让你在玩游戏的时候听你喜欢的音乐。不过,该游戏主机即将得到另一项音乐服务的支持-- Apple Music。本周早些时候,一位 Reddit 用户发帖称在 PlayStation 5 的音乐菜单中出现了 Apple Music。该选项显然是在他们建立了一个新账户并试图将其与 Spotify 联系起来之后出现的。不过,这个应用程序似乎并不工作。Eurogamer 说,在建立一个新的美国账户时

  • Google疑将推出似Apple One的订阅套餐Pixel Pass

    据外媒报道,Google似乎准备宣布一个名为Pixel Pass的新订阅套餐,该套餐将把新Pixel设备跟延长保修和几个Google服务的高级订阅结合起来。现在,Brandon Lee发布的一张图片中详细介绍了这一未经证实的捆绑服务。目前还不清楚Pixel Pass的价格,但文件显示它将通过Google Fi和Google Store跟Pixel设备一起销售。正如Lee所指出的,Pixel Pass似乎结合了苹果的iPhone升级计划(该计划通过月度订阅付款和延长保修期提供iPhone)和Apple

  • 索尼测试在PlayStation手机App上轻松分享PS5截图与视频剪辑

    索尼周一宣布:作为当前在日本和加拿大市场开启的“限量测试”的一部分,其正在酝酿推出一项新功能,以便玩家能够通过 PlayStation 应用程序,分享在 PS5 游戏主机上捕获的屏幕截图和视频片段。启用该功能后,应用程序端可以显示最新捕获的画面。推特配图索尼在常见问答(FAQ)中指出:“在 PS5 主机上手动创建游戏的屏幕截图或视频剪辑后,相关内容可在 14 天内通过配套的 PlayStation 应用程序进行访问”。截至目前(至少在测试?

  • 联想Legion Play掌机曝光 将与任天堂和Steam掌机竞争

    今年的掌机市场可谓风生水起,我们看到了任天堂Switch OLED以及令人惊讶的Steam Deck,现在看来,联想也想分一杯羹了。该公司正在准备发布自己的掌机产品联想Legion Play。Liliputing发现了联想Legion Play的图片以及一些更多的信息,它显示了新掌机的图片,这些图片也被链接到联想的网站,进一步证实了它的存在。联想Legion Play本应在今年早些时候的MWC 2021上正式发布,但该公司由于某些原因决定不发布。这款掌机似乎在运行一个

  • SpaceX证实在Inspiration4任务期间有警报响起

    据外媒报道,不久前,Inspiration4任务首次将全平民宇航员送入轨道。他们乘坐特殊的载人龙飞船进入轨道,该乘员舱放弃了通常用于连接国际空间站的对接硬件,而采用了一个穹顶窗,使宇航员在执行任务期间能够看到太空和地球。在穹顶窗区域,还有为这次任务配备的厕所。Inspiration4机组人员在准备任务时接受了使用太空厕所的培训。SpaceX首席执行官埃隆·马斯克此前确实通过Twitter确认机组人员上厕所时存在挑战,但没有详细说明原?

  • SpaceX计划在Inspiration4任务之后扩大“龙飞船”船队规模

    据外媒报道,本月早些时候,SpaceX通过其Inspriation4任务成功地将第一个全民用机组人员送入和送出轨道。虽然这次飞行遇到了一些挑战,即飞船上的厕所问题,但这次任务并没有出现问题。SpaceX现在证实,在Inspriation4任务之后,它感受到了人们对民用太空飞行的兴趣增加。鉴于兴趣的增加,SpaceX正在考虑增加其 “载人龙飞船(Crew Dragon)”船队的规模,以此来满足民用宇航员和运送NASA宇航员往返国际空间站的需要。目前,SpaceX和

  • 1Password推出Psst!服务:更安全更便携的和他人共享账号密码

    在工作场所和家庭环境中,我们时不时需要和他人共享账号密码,但安全地共享密码却可能非常棘手。1Password 旨在通过其新功能解决这个问题,该功能为你提供了一种以安全方式分享登录凭证的方法,甚至可以与那些没有该服务账户的人分享。这种新方法叫做 Psst!,是 Password Secure Sharing Tool(密码安全分享工具)的简称,它显然是该公司要求最多的功能之一。根据该公司进行的一项研究,大多数工人重复使用公司的凭证。在这些人中?

  • AMD霄龙Rome平台助力Netflix达成400Gbps带宽 超越Intel与Ampere

    Hardwareluxx 报道称:视频流媒体巨头之一的 Netflix,已利用 AMD 二代霄龙(EPYC)Rome 平台,达成了优于 Intel 和 Ampere 服务器解决方案的 400 Gbps 带宽性能。据悉,该公司在 EuroBSD 2021 会议期间公布了新的数据指标。可知截止 2020 年,Netflix 服务器仅能够达成 200 Gbps 的 TLS 加密带宽。(图 via Hardwareluxx)此外 Netflix 评估了于 2019 年切换到 AMD EPYC 平台的成效,现在看来该公司已实现了他们的目标。据说在转?

这篇文章对你有价值吗?

  • 热门标签