Application是一个共享对象,意味着所有访问此应用程序的客户均可以看到这个Application对象的值。使用Application和SessionID来统计当前在线人数。
代码
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{ // 在应用程序启动时运行的代码
System.Data.DataTable onlineUser = new System.Data.DataTable();
onlineUser.Columns.Add("SessionID");
onlineUser.Columns.Add("userIP");
onlineUser.Columns.Add("browser");
onlineUser.Columns.Add("osName");
onlineUser.AcceptChanges();
Application.Lock();
Application["onlineUser"] = onlineUser;
Application.UnLock();
}
void Application_End(object sender, EventArgs e)
{ // 在应用程序关闭时运行的代码
}
void Application_Error(object sender, EventArgs e)
{ // 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{ // 在新会话启动时运行的代码
string sessionID = Session.SessionID;
string userIP = Request.UserHostAddress;
HttpBrowserCapabilities bc = Request.Browser;
string osName = bc.Platform;
string browser = bc.Type;
System.Data.DataTable userDt = Application["onlineUser"] as System.Data.DataTable;
if (userDt == null)
{
return;
}
System.Data.DataRow[] currentRow=userDt.Select("SessionID='"+sessionID+"'");
if (currentRow.Length <= 0)
{ //当前用户没有在线
System.Data.DataRow newRow =userDt.NewRow();
newRow["SessionID"] = sessionID;
newRow["userIP"] = userIP;
newRow["browser"] = browser;
newRow["osName"] = osName;
userDt.Rows.Add(newRow);
userDt.AcceptChanges();
Application.Lock();
Application["onlineUser"] = userDt;
Application.UnLock();
}
}
void Session_End(object sender, EventArgs e)
{ // 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
string sessionID = Session.SessionID;
System.Data.DataTable userDt = Application["onlineUser"] as System.Data.DataTable;
if (userDt == null)
{
return;
}
foreach (System.Data.DataRow dr in userDt.Select("SessionID='" + sessionID + "'"))
{
userDt.Rows.Remove(dr);
}
userDt.AcceptChanges();
Application.Lock();
Application["onlineUser"] = userDt;
Application.UnLock();
}
</script>