会话状态事件

更新:2007 年 11 月

ASP.NET 提供了两种帮助您管理用户会话的事件:Session_OnStart 事件和 Session_OnEnd 事件;前者在新会话开始时引发,后者在会话被放弃或过期时引发。

ms178583.alert_note(zh-cn,VS.90).gif说明:

如果修改了 ASP.NET 应用程序的 Global.asax 文件或 Web.config 文件,则该应用程序将会重新启动。如果当前会话状态模式为 InProc,则所有存储在应用程序状态或会话状态中的值都将丢失。请注意,有些防病毒软件可以更新应用程序的 Global.asax 或 Web.config 文件的最后修改日期和时间。有关设置会话状态模式的信息,请参见 会话状态模式

Session_OnStart 事件

可以通过向 Global.asax 文件添加一个名为 Session_OnStart 的子例程来处理 Session_OnStart 事件。如果请求开始一个新会话,Session_OnStart 子例程会在请求开始时运行。如果请求不包含 SessionID 值或请求所包含的 SessionID 属性引用一个已过期的会话,则会开始一个新会话。

您可以使用 Session_OnStart 事件初始化会话变量并跟踪与会话相关的信息。

Session_OnEnd 事件

可以通过向 Global.asax 文件添加一个名为 Session_OnEnd 的子例程来处理 Session_OnEnd 事件。Session_OnEnd 子例程在 Abandon 方法已被调用或会话已过期时运行。如果超过了某一会话 Timeout 属性指定的分钟数并且在此期间内没有请求该会话,则该会话过期。

只有会话状态属性 Mode 设置为 InProc(默认值)时,才支持 Session_OnEnd 事件。如果会话状态属性 ModeStateServerSQLServer,则忽略 Global.asax 文件中的 Session_OnEnd 事件。如果会话状态属性 Mode 设置为 Custom,则由自定义会话状态存储提供程序决定是否支持 Session_OnEnd 事件。

您可以使用 Session_OnEnd 事件清除与会话相关的信息,如由 SessionID 值跟踪的数据源中的用户信息。

会话事件示例

下面的代码示例演示一个可以添加到 Global.asax 文件的 Session_OnStart 和 Session_OnEnd 子例程示例。在此示例中定义的这些子例程创建一个计数器,用来跟踪正在使用应用程序的应用程序用户的数量。请注意,只有会话状态属性 Mode 设置为 InProc 时,此示例才会正常运行,因为只有进程内会话状态存储才支持 Session_OnEnd 事件。

<script language="VB" runat="server">
Public Sub Application_OnStart()
  Application("UsersOnline") = 0
End Sub

Public Sub Session_OnStart()
  Application.Lock()
  Application("UsersOnline") = CInt(Application("UsersOnline")) + 1
  Application.UnLock()
End Sub

Public Sub Session_OnEnd()
  Application.Lock()
  Application("UsersOnline") = CInt(Application("UsersOnline")) - 1
  Application.UnLock()
End Sub
</script>
<script language="C#" runat="server">
public void Application_OnStart()
{
  Application["UsersOnline"] = 0;
}

public void Session_OnStart()
{
  Application.Lock();
  Application["UsersOnline"] = (int)Application["UsersOnline"] + 1;
  Application.UnLock();
}

public void Session_OnEnd()
{
  Application.Lock();
  Application["UsersOnline"] = (int)Application["UsersOnline"] - 1;
  Application.UnLock();
}
</script>

请参见

概念

ASP.NET 会话状态概述

ASP.NET 状态管理概述