了解 ASP.Net 会话生命周期

Posted

技术标签:

【中文标题】了解 ASP.Net 会话生命周期【英文标题】:Understanding ASP.Net session life time 【发布时间】:2009-06-04 15:01:35 【问题描述】:

我对 ASP 或 ASP.Net 会话生命周期(或生命周期)概念感到困惑。更具体地说,我的困惑是:

    IIS 如何决定新会话何时开始和现有会话何时结束?特别是当我们调用重定向代码时,IIS如何决定会话是继续还是结束? 如何设置会话过期时间? (目前我只知道通过web.config sessionState item 设置。) 一个会话是否可以访问另一个会话的变量?

【问题讨论】:

【参考方案1】:

会话通常通过在客户端机器上生成一个唯一标识符作为 cookie 来处理。这通常是一个会话 cookie,所以你不能轻易得到它。当您访问使用会话的站点时,它会查找此 cookie。如果没有找到,它会创建一个新会话,从而创建一个新会话。

设置过期时间的一种方法是在 web.config 中,您也可以在 IIS 中设置它,方法是转到您的网站属性 -> 主目录选项卡 -> 配置按钮 -> 选项选项卡 -> 会话超时。

您将无法访问其他人的会话数据。

【讨论】:

这完全内置在 asp.net(或 asp)中,如果您在 web.config 中设置了会话状态元素,则会自动发生:msdn.microsoft.com/en-us/library/h6bb9cz9(VS.80).aspx 无法访问其他人的会话数据由处理会话的方式保证。所有数据都直接与 cookie 中的唯一标识符相关联。唯一可以做到的是,如果他们将其他人的 cookie 复制到自己的机器上,或者修改他们的 cookie 以使用其他人的 GUID,他们将无法猜测。您不必担心其中任何一个。 1.你是对的,即使你不使用它们,如果在你的 web.config 中设置了 cookie,它也会出现。 2.您的会话变量将永远不可用于另一个浏览器会话。如果您有想要在会话之间保留的变量,您应该将它们放入物理 cookie 中,到期日期为msdn.microsoft.com/en-us/library/ms178194.aspx 3。会话时间基于服务器上次检测到任何活动的时间。如果用户继续使用,会话将永远保持活动状态。 您的 global.asax 有 session_begin 和 session_end 两种方法供您使用。我不确定是否有办法确定当前会话何时到期。您可能只需要获取页面发送到客户端的时间的日期时间戳,然后将其添加 20 分钟,或者如果您增加它则更长。 1 和 3) 我在经典 ASP 中工作已经有一段时间了,但我会在 IIS 中设置会话超时,正如我在原始帖子中提到的那样。 session_end 是特定于 asp.net 的,我不记得有经典的 asp 等价物。我可能是错的。 2)原因是因为有两种cookie,会话cookie和物理cookie。会话 cookie 仅存在于客户端计算机上的 ram 中,而不是您可以浏览到的物理 cookie。当用户关闭浏览器时,所有会话 cookie 都会自动销毁。 我不是 100% 确定你在问什么。但是在尝试从中提取值之前,您应该确保会话变量存在。 if(Session["KeyName"] != null) myvariable = Session["KeyName"]; 【参考方案2】:

    会话开始是因为请求不包含会话 cookie,或者它包含的会话 cookie 不再映射到会话。会话以 a) 结束,它处于空闲状态,在超时期间没有进一步的请求引用它。 b)它被代码故意中止。 c) 进程执行时进程内会话终止,例如当应用被回收时。

    更改超时的不同方法基本上是修改 web.config 或从其继承值的配置文件。

    除非会话对象被代码故意放置在另一个会话可以访问它的地方,否则不会。

【讨论】:

酷!对于 1,您说“1.Session 开始是因为请求不包含会话 cookie 或它包含的会话 cookie 不再映射到会话”——我的困惑是谁负责实现有关会话 cookie 的逻辑,ASP .Net 运行时? 2.对于3,我认为您的意思是从不同会话中引用相同的对象实例,因此在一个会话中修改引用会影响在另一个会话中检索的值? ASP.NET 运行时为您处理所有会话创建和 cookie 创建。从根本上讲,您可以(实际上不要这样做!)维护一个静态 Dictionary 并在创建每个会话对象时粘贴对它的引用。使用您自己发明的某个字符串键,您可以让在一个会话中运行的代码访问另一个会话对象。我想不出实际这样做的合理理由,我敢肯定它不会有好的结局。 如果会话过期,我们从会话变量中检索什么值? String.Empty? 它将为空。我会使用 String.IsNullOrEmpty 方法来测试它的值。 if (!String.IsNullOrEmpty(Session["AmILoggedIn") //做一些关于未登录的事情 【参考方案3】:

您可以通过以下方式以编程方式设置会话超时:

Session.Timeout = 60; 

【讨论】:

【参考方案4】:

不要忘记 AppPool 设置...默认情况下(无论如何是 IIS 6)它将每 120 分钟回收一次。因此,有人可能会在小于设置的 Session_Timeout 值的时间内丢失会话。

【讨论】:

以上是关于了解 ASP.Net 会话生命周期的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 页生命周期概述

ASP.NET应用程序与页面生命周期

ASP.NET 页生命周期概述1

深入了解asp.net框架。生命周期以及事件处理机制

ASP.NET应用程序与页面生命周期

Asp.net生命周期