ASP.NET中利用Application和Session统计在线人数、历史访问量

原创 2014年09月25日 22:08:33

      

          先来简单说一下ASP.NET中的Application和Session

          下图是我们非常熟悉的Web应用程序的结构:

           

       在这张图中,Web服务器中运行的Web应用程序就是我们所说的Application,每个客户端与Web服务器之间建立的连接就可以看做是一个Session。比如现在服务器端运行的是一个论坛系统,那么现在这个正运行在服务器端的论坛系统的软件就可以看做Application,而每个在线的用户与之建立的连接就相当于一个Session。

       那么很容易就会理解,Application是共享的,相当于“全局变量”,Session不是共享的,是属于每个客户端(浏览器)私有的。

       所以上图用Application和Session可以表示为:

              

        Application

        常用属性:

      属性     说明
All   返回全部的Application对象变量到一个对象数组
AllKeys   返回全部的Application对象变量到一个字符串数组
Count   返回Application中对象变量的数量

        常用方法:    

  方法  说明
Add   新增一个Application变量值
Clear   清空全部Application变量值
Get   变量名传回的变量值
Set
  更新Application变量值
Lock
  锁定所有Application的变量值
UnLock
  解除锁定Application的变量值


        Session

        常用属性:

          属性         说明
Count 
  获取会话状态集合中Session对象的个数
Contents
  获取对当前会话状态对象的引用
Keys
  获取存储在会话中的所有值的集合
SessionID
  获取用于标识会话的唯一会话ID
TimeOut 
  获取或设置会话状态提供程序终止会话之前所允许的超时期限
Mode   获取当前会话状态模式
    
        常用方法:
    方法     说明
Add
  新增一个Session对象
Clear
  清除会话状态中的所有值
CopyTo
  将会话状态值的集合富之岛一维数组中
Remove   删除会话状态集合中的项
RemoveAll   清除所有会话状态的值


        ASP.NET中统计在线人数和历史访问人数,还需要四个事件:Application_Start()事件、Application_End()、Session_Start()事件和Session_End()事件。

       当程序启动时,会首先在Global.asax.cs文件中触发Application的Application_Start()事件,我们需要在这个事件中增加两个Application变量值(因为这两个值是Application中的变量值,所以就相当于整个程序的“公共变量”):totalCount(用来表示总的访问量)、onlineCount(用来表示当前在线人数):        

protected void Application_Start()
        {
            string strConn = "server=192.168.24.123;database=数据库名;uid=sa;pwd=123456;";    //数据库连接字符串
            SqlConnection conn = new SqlConnection(strConn);                                  //实例化数据库连接对象
            conn.Open();                                                                      //打开数据库连接
            string cmdText = "select count from Count";                                       //定义查询字符串
            SqlCommand cmd = new SqlCommand(cmdText, conn);                                   //实例化命令对象
            int count = (int)cmd.ExecuteScalar();                                             //取出数据库中历史访问人数

            Application["total"] = count;                                                     //定义Application变量值total并赋值为历史访问量
            Application["onLine"] = 0;                                                        //定义Application变量值onLine并赋值为0
        }

       下面就要编写Session_Start()事件代码,当每个客户端(浏览器)访问服务器时,就会触发Session_Start()事件,这事就要让“公共变量”totalCount和onlineCount都自增1,这时,当有多个客户端同时访问时,就有可能发生错误,所以要Application的Lock()方法先把Application中的变量锁起来(Application执行了Lock()方法之后,整站中所有关于Application的操作都会被锁定延时执行,包括Application赋值和Application读取),只让一个客户端进行这两个变量的自增,之后再进行解锁,供其他客户端进行操作:      

protected void Session_Start()
        {
            Application.Lock();                                        //锁定Application
            Application["total"] = (int)Application["total"] + 1;      //总访问量加1
            Application["onLine"] = (int)Application["onLine"] + 1;    //在线人数加1
            Application.UnLock();                                      //解除锁定
        }


        现在在线人数和历史访问数量都统计出来了,需要显示的时候直接调用Application["变量值"]就可以,比如要在名为Label的控件上显示在线人数,只需Label.Text=Application["onLine"].ToString()就OK了!需要注意的是,Application和Session中存储的变量值都是object类型的,给他们赋值的时候可以直接赋值,但是取出的时候就需要考虑类型了。

       当一个客户端(浏览器)与服务器断开连接(即此客户端与服务器的会话关闭)时,会触发Session_End()事件,这时历史访问数量不改变,在线人数需要减1:

protected void Session_End()
        {
            Application.Lock();                                          //锁定Application
            Application["onLine"] = (int)Application["onLine"] - 1;      //总访问数量不变,在线人数减1
            Application.UnLock();                                        //解除锁定
        }
        为了方便测试,上面的例子可以通过在一台电脑上开启多个浏览器,也就相当于与服务器建立了多个Session,也许您测试的时候会发现一个问题,假如现在在线人数是10,您关闭了某个浏览器时,测试当前的在线人数即Application["onLine"]的值还是10 ,并没有执行“减1”操作。这是因为Session的TimeOut值默认是20分钟,也就是说,默认情况下,关闭了浏览器并不代表这个浏览器和服务器之间的连接已经断开,而要等待20分钟之后才会断开连接。(为了测试效果,您可以将TimeOut的值设置小一点)

         最后,假如服务器要关闭,就要把目前Application中存储的历史访问总数重新更新到数据库中,需要在Application_End()事件中进行:

protected void Application_End()
        {
            string strConn = "server=192.168.24.123;database=数据库名;uid=sa;pwd=123456;";    //定义数据库连接字符串
            SqlConnection conn = new SqlConnection(strConn);                                  //实例化数据库连接对象
            conn.Open();                                                                      //打开数据库连接
            string cmdText = "update Count set count=@count";                                 //定义执行命令
            SqlCommand cmd = new SqlCommand(cmdText, conn);                                   //实例化命令对象
            cmd.Parameters.Add(new SqlParameter("@count", Application["total"]));             //为参数@count赋值为现在的总访问量
            cmd.ExecuteNonQuery();                                                            //执行命令
            conn.Close();                                                                     //关闭数据库
        }
       通常在整个过程中,大多数人对Application_End()这个事件的疑问是最大的,因为如果您只是在VisualStudio上做的测试的话,关闭系统时,没有触发Application_End()事件,新的数据也就没有被写入到数据库中。那么Application_End()究竟在什么时候才会被触发呢 ?

        想弄明白这个问题,需要将程序发布,这里以IIS为例,用IIS发布了程序之后运行,当想要触发Application_End()事件把最新的历史访问量写入到 数据库中时,需要在IIS中关闭此程序的运行,如下图:

        

        注意:只是在服务器上停止该程序的运行才会触发Application_End()事件,重启和断电等情况并不能触发。

        

        虽然统计在线人数和历史访问量是个并不起眼的小功能,但是通过捋一遍,细细地总结了一下,又学到了好多东西,脑子里的知识网又增大了一点点。。。。



版权声明:本文为博主原创文章,未经博主允许不得转载。

asp.net 使用Application和Session对象统计在线人数

asp.net 使用Application和Session对象统计在线人数   使用Application和Session对象,结合全局配置文件Global.asax和站点配置文件Web.confi...

【ASP.NET】——统计在线人数、历史访问人数

先介绍一下,在设计过程中,用到的Application和Session方法:

如何实现ASP.NET中网站访问量的统计

下面介绍如何进行ASP.NET中网站访问量的统计。 一、建立一个数据表IPStat用于存放用户信息 我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address),IP来源(IP_...

ASP.Net Application的用法

1.Application的创建 Application["application名称"] = "application的值"; 2.Application的使用 string str = ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

键盘键值ASCII码对照表(十进制和十六进制)

完整的8位ASCII字符表ASCII, American Standard Code for Information Interchange 念起来像是 “阿斯key”,定义从 0 到 127 的一百...

键盘与鼠标按键的键值对照表

键盘与鼠标按键的键值对照表 该表总结了常见的键盘与鼠标按键对应的按键名称、十进制、十六进制表示形式与按键功能。方便用户进行查询。提供给需要的朋友使用。 常数名称...

asp.net 在线人数统计,页面访问量 Application ,session

asp.net 在线人数统计,页面访问量 Application ,session 1.新建网站,添加几个窗体。webForm1.aspx ,ViewStateForm.aspx 2.在网...
  • zhexcel
  • zhexcel
  • 2012年08月15日 15:49
  • 163

使用ASP.NET的Application对象实现在线人数统计的功能

注:最近在复习ASP.NET,为了加深印象,会制作一些小的demo程序,分享给大家。 1 新建ASP.NET网站,编辑Global.asax文件,修改后的文件内容如下所示。 ...
  • tiana0
  • tiana0
  • 2015年04月04日 11:14
  • 2487
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET中利用Application和Session统计在线人数、历史访问量
举报原因:
原因补充:

(最多只允许输入30个字)