一、显示页面代码
1
public partial class _Default : System.Web.UI.Page
2![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
3
protected void Page_Load(object sender, EventArgs e)
4![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
5
vistors.Text = "本站当前有:<b>" + Application["user_sessions"].ToString() + "" + "</b> 位访问者!";
6![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
}
8
}
二、Global.asax页面代码实现
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Global.asax
1 <%@ Application Language="C#" %>
2
3 <script runat="server">
4
5 void Application_Start(object sender, EventArgs e)
6 {
7 // Code that runs on application startup
8 Application["user_sessions"] = 0;
9
10 }
11
12 void Application_End(object sender, EventArgs e)
13 {
14 // Code that runs on application shutdown
15
16 }
17
18 void Application_Error(object sender, EventArgs e)
19 {
20 // Code that runs when an unhandled error occurs
21
22 }
23
24 void Session_Start(object sender, EventArgs e)
25 {
26 // Code that runs when a new session is started
27 Application.Lock();
28 Application["user_sessions"] = (int)Application["user_sessions"] + 1;
29 Application.UnLock();
30
31 }
32
33 void Session_End(object sender, EventArgs e)
34 {
35 Application.Lock();
36 Application["user_sessions"] = (int)Application["user_sessions"] - 1;
37 Application.UnLock();
38 // Code that runs when a session ends.
39 // Note: The Session_End event is raised only when the sessionstate mode
40 // is set to InProc in the Web.config file. If session mode is set to StateServer
41 // or SQLServer, the event is not raised.
42
43 }
44
45 </script>
46
三、讨论
以上我们是通过session来统计在线的用户数量,如果用户没有关闭浏览器而去浏览另外的页面,那么就会给我们的统计带来误差,所以在session有效期上我们可以通过Timeout来设置,一般是设置为20分钟。
另外,ASP中如果浏览器中的Cookie设置为“禁用”, 这样我们的session就无法传递了,这也就导致了无法统计,不过在ASP.NET我们知道了解决办法,我们可以在web.config中设置 <sessionState cookieless="false"></sessionState>中的false设置为true就可以了,就是不使用Cookie也可以传递session,这就可以确保我们的程序在不同的环境中也能顺利进行。
四、注意事项
这里需要注意的是 Session_End 事件,只有 InProc 模式支持该事件,也就是说,只有将会话数据存储在 ASP.NET 辅助进程中时才支持该事件。它标志着会话的结束,并用于执行终止该会话所需的所有清除代码。对于要引发的 Session_End 事件来说,必须首先存在会话状态,这意味着必须在该会话状态中存储一些数据,并且必须至少完成一个请求。如果会话状态属性 Mode 为 StateServer 或 SQLServer,则忽略 Global.asax 文件中的 Session_End 事件。如果会话状态属性 Mode 设置为 Custom,则由自定义会话状态存储提供程序决定是否支持 Session_End 事件。
会话状态的配置是通过设置Web.config文件的<sessionState>节来实现的。下面介绍一下进程内模式的配置方法,它也是默 认的会话状态模式。若要使用进程内模式,请将 <sessionState> 元素的 mode 属性设置为 Inproc。
下面显示了进程内模式的一个配置设置示例。
<configuration>
<system.web>
<sessionState mode="Inproc"
cookieless="false"
timeout="20"/>
</sessionState>
</system.web>
</configuration>