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

北大青鸟的视频中讲了很多很实用的例子,这是其中一个,在实现的过程中,遇到一些问题,但也都在老师的指导下和通过查阅资料解决了,感觉收获颇丰。

在做这个例子的时候发现:ASP.NET的Application和Session统计在线人数和历史访问人数时不准。明明已经关闭浏览器了,在线人数却没少,重新登录,历史人数也没增加。难道是我做错了,No.原因在这里。

首先,先简单说一下Application和Session。

Application:应用程序类的对象。类比到这个程序,服务器端的统计人数程序就相当于一个Application,而用户与之建立的连接则相当于一个Session。

由此,能理解到:Application是共享的,相当于全局变量,Session则是会话级的,相当私有变量。

借用师哥的一张图代表他们的关系就是:

类比出:

当程序启动时,首先执行Application_Start()事件:这里有两个两个变量:total用于记录历史人数,online用于记录在线人数。

<span style="font-family:KaiTi_GB2312;font-size:24px;"> protected void Application_Start(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("server=.;database=countPeople;uid=sa;pwd=123456;");
            con.Open();
            SqlCommand cmd = new SqlCommand("select * from countPeople", con);
            int count = Convert.ToInt32(cmd.ExecuteScalar());
            con.Close();

            Application["total"] = count;
            Application["online"] = 0;
        }</span>

继而,当用户登录时,会触发Session_Start()事件。让两变量+1。这里还加了一个锁,是为了防止并发访问而导致错误。加锁后:Application的Lock()方法先把Application中的变量锁起来(Application执行了Lock()方法之后,整站中所有关于Application的操作都会被锁定延时执行,包括Application赋值和Application读取),只让一个客户端进行这两个变量的自增,之后再进行解锁,供其他客户端进行操作:

<span style="font-family:KaiTi_GB2312;font-size:24px;"> protected void Session_Start(object sender, EventArgs e)//进行连接
        {
            Session.Timeout = 1;
            Application.Lock();//加锁:防并发
            Application["total"] = (int)Application["total"] + 1;    //历史人数+1
            Application ["online"]=(int)Application ["online"]+1;    //在线人数+1
            Application .UnLock();//解锁
        }</span>

至此,历史人数和在线人数都更新在变量中了,需要的时候调用即可。

当一个客户端下线的时候,会触发Session_End()事件,这时,在线人数-1。

<span style="font-family:KaiTi_GB2312;font-size:24px;"> protected void Session_End(object sender, EventArgs e)//断开连接
        {
            Application.Lock();
            Application["online"] = (int)Application["online"] - 1;
            Application.UnLock();
        }</span>

做过这个例子的同学应该遇到过:打开两个客户端,即建立两个Session,在线人数为2,关闭其中一个,刷新另一个,结果在线人数还是2。

这是因为Session中有个默认的Timeout=20。即默认情况下,关闭了浏览器并不代表这个浏览器和服务器之间的连接已经断开,而要等待20分钟之后才会断开连接。(为了测试效果,您可以将TimeOut的值设置小一点,最小为1)。Timeout还有一个这样的作用:当客户端在timeout设置时间内没有任何响应,也当下线处理,即在线人数减1,以减少无必要的资源占用。

最后,关闭程序,Application中存储的历史访问数据存入数据库。

<span style="font-family:KaiTi_GB2312;font-size:24px;"> protected void Application_End(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection("server=.;database=countPeople;uid=sa;pwd=123456;");
            con.Open();
            SqlCommand cmd = new SqlCommand("update countPeople set num="+Application["total"].ToString(),con);
            cmd.ExecuteNonQuery();
            con.Close();

        }</span>

但结束运行后,会发现,数据库中并没有增加的数据,这说明关闭系统时没有触发Application_End()这个事件。那该怎么做呢?

首先,得把程序发布,以IIS为例:当想触发Application_End()时,需要在IIS中关闭此程序的运行。重启和强行关闭都不会触发该事件。

除此方法可以触发Application_End()外,正常关机可以触发,正常关机时,Web应用程序关闭,历史记录更新。而Web关闭时,关的是:控制面板\系统和安全\管理工具\服务:world wide web publishing service,所以,为了开着机看效果,我们可以手动关闭该项,以此来更新数据库。

总结:

这是一个很实用的例子,今后应该会经常遇到。通过这个例子,了解了Application和Session的区别,联系......也通过这个例子,学会了不断尝试,再尝试中寻找并验证答案......

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

时间: 2024-10-27 01:50:34

【ASP.NET】——统计在线人数、历史访问人数的相关文章

Asp.Net实现记录历史访问人数和当前在线人数

************************************在Global.asax中如下************************ <%@ Import Namespace="System.Data.SqlClient" %>起始: void Application_Start(Object sender, EventArgs e)//当前应用程序启动这件事会发生        { //SqlConnection con = new SqlConnect

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

先来简单说一下ASP.NET中的Application和Session 下图是我们非常熟悉的Web应用程序的结构: 在这张图中,Web服务器中运行的Web应用程序就是我们所说的Application,每个客户端与Web服务器之间建立的连接就可以看做是一个Session.比如现在服务器端运行的是一个论坛系统,那么现在这个正运行在服务器端的论坛系统的软件就可以看做Application,而每个在线的用户与之建立的连接就相当于一个Session. 那么很容易就会理解,Application是共享的,相

Application对象——记录历史访问

1.Application 程序级变量将多个会话和请求之间的全局信息共享. 常用方法Add()    Lock()   UnLock() 例子:显示历史访问人数和在线人数 Globl.aspx中代码 <span style="font-size:18px;"> protected void Application_Start(object sender, EventArgs e) //设置一个全局变量,实现用户共享 { //Application["count&q

页面在线访问人数统计&amp;&amp;在线登录人数统计一

一.页面在线访问人数统计 OnlineSessionListener监听器(实现HttpSessionListener)接口来实现页面在线访问人数统计,当有用户访问到页面就会创建一个session,此时会触发public   void   sessionCreated(HttpSessionEvent   se)方法,如果session失效,此时会触发public   void   sessionDestroyed(HttpSessionEvent   se)方法.在此方法里我们用OnlineL

Asp.net实现在线人数统计功能代码实例

application最经典的一个方法:统计在线人数,这需要借助于我们的全局应用程序类来对登录的用户信息进行统计: 以下是代码片段:    void application_start(object sender, eventargs e)  {  //在应用程序启动时运行的代码  application["count"] = 0;  system.io.filestream fs = system.io.file.open(server.mappath("count.txt

asp.net MVC 统计在线人数功能实现

今天开发一个设计一个统计在线人数的统计.实现方式是在MVC 中,用户次执行一个Action请求完成后,向数据表中插入一条用户心跳记录,统计在线人数则是根据该记录,30分钟内有记录的用户则为在线状态. 首先设计表心跳记录表结构MOdel 接下来添加 CheckACAttribute 类继承 ActionFilterAttribute基类,并在FilterConfig类中注册. public class FilterConfig    {        public static void Regi

博客园添加访问人数统计

无意中看到有这个访问量的统计,觉得挺好玩的,我们现在就来添加一个吧: 1. 先到http://www.amazingcounters.com/sign-up.php   这个地址去申请一个帐户,申请时填写好自己的资料,比如 你的统计风格样式.要统计的地址.要统计的类型,是浏览量(PV) 还是 访客数(UV),或者你也可以2个都统计:这些统计数据都是可以任意修改的哟,不过我们最好还是以真实的访问量为主吧: 2. 在上述网站的"Get HTML Code See Statistics"菜单

【Jsp】利用Application对象实现访问人数统计功能

利用Application对象实现访问人数的统计很常见,但是一些书籍讲解这一技术的时候,往往没有做完整.一旦服务器重启,由于Application会被销毁,重新建立,人数统计则会再一次从零开始.解决方法,个人认为,应该同时利用到数据库,这样无论服务器要重启或者遭遇到停机什么,被统计的人数还是会一直累计上去,不会丢失.下面就介绍一个例子,解决利用Application对象实现访问人数统计功能由于服务器重启或者停机而导致从零开始的问题,同时介绍如果利用Application对象把保存到web.xml

统计网站访问人数

添加一个Global.asax文件,加入以下代码: void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 int count = 0; System.IO.StreamReader srd; string file_path = Server.MapPath("counter.txt"); //打开文件进行读取 srd = System.IO.File.OpenText(file_path); whi