「提高」在Asp.Net网站里列出所有登录用户和游客

技术支持来自我的老师: http://user.qzone.qq.com/56583021/blog/1207621165
为了立刻就能看到效果,我们首先将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便过期 -->  
接着对Global.asax.cs文件里的Application_Start事件编程,这个事件是当第一个用户访问网站的时候触发,在这个事件里我们设定了一个全局的Hashtable对象用来保存所有的用户名,该对象保存在Application对象里。
protected   void  Application_Start(Object sender, EventArgs e)
    
{
        
// 定义全局表,用以储存在线的会员和游客。
        Hashtable table = new Hashtable();
        
// 在.Net里,还可以储存在Cache里。
        Application.Add("OnlineList", table);
    }
当有新的客户端访问网站,服务器会与该客户端建立一个会话,这时候服务器会触发一个Session_Start事件:
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();
    }
当会话结束时,我们也需要清除该客户端的在线信息。
protected   void  Application_End(Object sender, EventArgs e)
    
{
        ((Hashtable)Application[
"OnlineList"]).Clear();
        Application.Remove(
"OnlineList");
    }
用户刚开始访问网站的时候,他的身份是“游客”,当他登录之后,他的身份就是注册用户了,于是我们在Login.aspx.cs里对按钮的单击事件加入如下代码:
private   void  btnLogin_Click( object  sender, System.EventArgs e)
    
{
        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 >
ViewOnline.aspx.cs:
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 窗体设计器生成的代码
    }

}


在这里我们把登录的用户名和游客(“guest”)等信息以哈希表的方式储存在了Application对象中,如果大家还需要储存用户的登录时间或客户端IP(用Request.UserHostAddress可以获取客户端IP地址),那么请自己扩充--如果储存的信息量比较大,我们可以考虑用数据库替换Application对象来储存用户信息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值