会话状态事件
更新:2007 年 11 月
ASP.NET 提供了两种帮助您管理用户会话的事件:Session_OnStart 事件和 Session_OnEnd 事件;前者在新会话开始时引发,后者在会话被放弃或过期时引发。
说明: |
---|
如果修改了 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 事件。如果会话状态属性 Mode 为 StateServer 或 SQLServer,则忽略 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>