技术支持来自我的老师:
http://user.qzone.qq.com/56583021/blog/1207621165
为了立刻就能看到效果,我们首先将Web.Config文件里的Session过期时间设短一点:
接着对Global.asax.cs文件里的Application_Start事件编程,这个事件是当第一个用户访问网站的时候触发,在这个事件里我们设定了一个全局的Hashtable对象用来保存所有的用户名,该对象保存在Application对象里。
当有新的客户端访问网站,服务器会与该客户端建立一个会话,这时候服务器会触发一个Session_Start事件:
当会话结束时,我们也需要清除该客户端的在线信息。
用户刚开始访问网站的时候,他的身份是“游客”,当他登录之后,他的身份就是注册用户了,于是我们在Login.aspx.cs里对按钮的单击事件加入如下代码:
最后,我们把当前在线用户的列表在页面里面显示出来。
ViewOnline.aspx:
ViewOnline.aspx.cs:
在这里我们把登录的用户名和游客(“guest”)等信息以哈希表的方式储存在了Application对象中,如果大家还需要储存用户的登录时间或客户端IP(用Request.UserHostAddress可以获取客户端IP地址),那么请自己扩充--如果储存的信息量比较大,我们可以考虑用数据库替换Application对象来储存用户信息。
为了立刻就能看到效果,我们首先将Web.Config文件里的Session过期时间设短一点:
<
sessionState
mode
="InProc"
stateConnectionString
="tcpip=127.0.0.1:42424"
sqlConnectionString
="data source=127.0.0.1;Trusted_Connection=yes"
cookieless
="false"
timeout
="1"
/>
<!-- 默认为20,现在改成1,表示1分钟后Session便过期 -->
<!-- 默认为20,现在改成1,表示1分钟后Session便过期 -->
protected
void
Application_Start(Object sender, EventArgs e)
... {
// 定义全局表,用以储存在线的会员和游客。
Hashtable table = new Hashtable();
// 在.Net里,还可以储存在Cache里。
Application.Add("OnlineList", table);
}
... {
// 定义全局表,用以储存在线的会员和游客。
Hashtable table = new Hashtable();
// 在.Net里,还可以储存在Cache里。
Application.Add("OnlineList", table);
}
protected
void
Session_Start(Object sender, EventArgs e)
... {
// 锁定Application对象,防止别的客户端访问。
Application.Lock();
Hashtable table = (Hashtable)Application["OnlineList"];
if (!table.ContainsKey(Session.SessionID))
table.Add(Session.SessionID, "guest");
Application["OnlineList"] = table;
// 开锁。
Application.UnLock();
}
... {
// 锁定Application对象,防止别的客户端访问。
Application.Lock();
Hashtable table = (Hashtable)Application["OnlineList"];
if (!table.ContainsKey(Session.SessionID))
table.Add(Session.SessionID, "guest");
Application["OnlineList"] = table;
// 开锁。
Application.UnLock();
}
protected
void
Application_End(Object sender, EventArgs e)
... {
((Hashtable)Application["OnlineList"]).Clear();
Application.Remove("OnlineList");
}
... {
((Hashtable)Application["OnlineList"]).Clear();
Application.Remove("OnlineList");
}
private
void
btnLogin_Click(
object
sender, System.EventArgs e)
... {
Hashtable memberList = (Hashtable)Application["OnlineList"];
// 在此添加当前登录的用户名。
// 注意:“guest”为系统保留关键字,
// 普通用户不能以此为用户名。
memberList[Session.SessionID] = tbUsername.Text;
}
... {
Hashtable memberList = (Hashtable)Application["OnlineList"];
// 在此添加当前登录的用户名。
// 注意:“guest”为系统保留关键字,
// 普通用户不能以此为用户名。
memberList[Session.SessionID] = tbUsername.Text;
}
ViewOnline.aspx:
<%
@ Page language
=
"
c#
"
Codebehind
=
"
ViewOnline.aspx.cs
"
AutoEventWireup
=
"
false
"
Inherits
=
"
Test.ViewOnline
"
%>
<! DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.0 Transitional//EN " >
< HTML >
< HEAD >
< title > 在线会员 </ title >
</ HEAD >
< body >
< form id = " Form1 " method = " post " runat = " server " >
< div id = " divCount " > 在线人数: < asp:label id = " lblMemberCount " runat = " server " ></ asp:label ></ div >
< div id = " divMemberList " > 会员: < asp:label id = " lblMemList " runat = " server " ></ asp:label ></ div >
< div id = " divGuestList " > 游客:
< asp:Label id = " lblGuestList " runat = " server " ></ asp:Label ></ div >
</ form >
</ body >
</ HTML >
<! DOCTYPE HTML PUBLIC " -//W3C//DTD HTML 4.0 Transitional//EN " >
< HTML >
< HEAD >
< title > 在线会员 </ title >
</ HEAD >
< body >
< form id = " Form1 " method = " post " runat = " server " >
< div id = " divCount " > 在线人数: < asp:label id = " lblMemberCount " runat = " server " ></ asp:label ></ div >
< div id = " divMemberList " > 会员: < asp:label id = " lblMemList " runat = " server " ></ asp:label ></ div >
< div id = " divGuestList " > 游客:
< asp:Label id = " lblGuestList " runat = " server " ></ asp:Label ></ div >
</ form >
</ body >
</ HTML >
using
System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Test
... {
/**//// <summary>
/// OnlineCount 的摘要说明。
/// </summary>
public class ViewOnline : System.Web.UI.Page
...{
protected System.Web.UI.WebControls.Label lblMemList;
protected System.Web.UI.WebControls.Label lblGuestList;
protected System.Web.UI.WebControls.Label lblMemberCount;
private void Page_Load(object sender, System.EventArgs e)
...{
// 获取全局表。
Hashtable memberList = (Hashtable)Application["OnlineList"];
lblMemberCount.Text = memberList.Count.ToString();
// 遍历表中的用户名并打印。
foreach (string key in memberList.Keys)
...{
string username = memberList[key].ToString();
if (username == "guest")
lblGuestList.Text += username + ",";
else
lblMemList.Text += username + ",";
}
}
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Test
... {
/**//// <summary>
/// OnlineCount 的摘要说明。
/// </summary>
public class ViewOnline : System.Web.UI.Page
...{
protected System.Web.UI.WebControls.Label lblMemList;
protected System.Web.UI.WebControls.Label lblGuestList;
protected System.Web.UI.WebControls.Label lblMemberCount;
private void Page_Load(object sender, System.EventArgs e)
...{
// 获取全局表。
Hashtable memberList = (Hashtable)Application["OnlineList"];
lblMemberCount.Text = memberList.Count.ToString();
// 遍历表中的用户名并打印。
foreach (string key in memberList.Keys)
...{
string username = memberList[key].ToString();
if (username == "guest")
lblGuestList.Text += username + ",";
else
lblMemList.Text += username + ",";
}
}
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
在这里我们把登录的用户名和游客(“guest”)等信息以哈希表的方式储存在了Application对象中,如果大家还需要储存用户的登录时间或客户端IP(用Request.UserHostAddress可以获取客户端IP地址),那么请自己扩充--如果储存的信息量比较大,我们可以考虑用数据库替换Application对象来储存用户信息。