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
属性中被指定的时间限制(以分钟为单位)的会话都将会被自动过期。
Session_OnEnd
事件只在会话状态的 Mode
属性被设置成 InProc
(默认值)的时候才被支持。如果会话状态的 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="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>