Asp.Net 网页计数器(一)

1. 解决方案        本文实现对网站的访问量的统计,主要是对application 和session两个对象的理解,在对历史访问量进行统计时,由于可能出现服务停止等情况,所以当服务正常停止时,将会把当前的历史访问人数写入数据库,下一次启动服务时将会从数据库中读出历史访问人数,从而保证了历史访问人数不会被清为0。

2. 实验步骤         新建一个web应用程序项目,命名为Count;在打开的WebForm1中增加4个lable,并将其中两个的text属性分别设置为“历史访问人数”和“当前在线人数”,其余两个的两的text属性都设置为空,id属性分别设置为lblCount 和lblOnline;lblCount用来显示历史访问的人数,lblOnline用来显示当前在线的人数。

在SQL2000中创建数据库,代码如下:

         create database [count] use [count]          create table [count]            ( [count] int primary key )          insert into [count] values(0)

       这段代码将创建一个名为COUNT的数据库,并将它使用,作为当前的数据库,然后再创建一个数据表,这个表只有一个字段,它用来记录历史访问人数,了、最后在该表中插入一个一个数0,当服务第一次启用时就从该表中读出0来初始化application[“COUNT”]

      从“解决方案资源管理器”中打开global.asax文件 ,双击打开代码文件,在这个文件中由于要用到SQL链接数据库,所以要添加引用。

          using System.Data.SqlClient;          //下一步将是编辑application_start事件,            Application_Start事件中添加代码后如下:          protected void Application_Start(Object sender, EventArgs e)            {  SqlConnection conn = new SqlConnection("server=.;database=count;uid=sa;pwd=");               conn.Open();//打开数据库               SqlCommand comm = new SqlCommand("select * from count",conn);               Application["Count"] = comm.ExecuteScalar();//从数据库中读出历史访问量               conn.Close();//关闭数据库               Application.Add("Online",0);//在线人数初始化为0           }

        Application_Start事件在应用程序启动时触发。        当一个用户来访问我们的网站时,Session_Start事件将被触发,历史访问人数和当前在线人数都要加1,所以Session_Start事件应该是这的:

  protected void Session_Start(Object sender, EventArgs e)         { Session.Timeout = 1;           Application.Lock();           Application["Count"]=(int)Application["Count"]+1;           Application["Online"]=(int)Application["Online"]+1;           Application.UnLock();         }

    为了避免多个用户同时试图修改历史访问量,必须在要修改时对其进行锁定,修改完以后则要解锁,否则其它的用户将不能修改其值。  为了方便后面的测试,将session的过期时间设为1分钟。 ? 如果一个session销毁了,那么将会触发session_end事件,在这个事件中当前的在线人数会减1,而历史访问量是不应该改变的。所以session_end事件应该是这的:

   protected void Session_End(Object sender, EventArgs e)           { Application.Lock();             Application["Online"]=(int)Application["Online"]-1;             Application.UnLock();           }

       当一个应用程序正常结束时,application_end事件会被触发,在这个事件中,要把历史访问量写入数据库中,只有这样的话当应用程序下一次启动时霆会从数据库中读出合理的历史访问量。下面是applicationz_end事件: 

  protected void Application_End(Object sender, EventArgs e)          {int Count = (int)Application["Count"];           string SqlString = "UpDate count set count = '"+Count+"'";           SqlConnection conn = new SqlConnection("server=.;database=count;uid=sa;pwd=");           conn.Open();           SqlCommand Comm = new SqlCommand(SqlString,conn);           Comm.ExecuteNonQuery();           conn.Close();  }

        最后一步就是要在网页上显示访问量统计,现在将窗口切换到WebForm1.aspx,双击打开WebFrom.aspx.cs文件,在Page_Load事件中添加代码后如下:   private void Page_Load(object sender, System.EventArgs e)        {               this.lblCount.Text = Application["Count"].ToString();               this.lblOnline.Text = Application["Online"].ToString();        }

       到此为至,计数器做好了,下面是调试和测试。将webform1.aspx设为启始页,然后运行程序,结果是历史访问人数和当前在线人数都是1,如果你刷新该页,两者都将不会变,因为只有启动一个不同的浏览器,才算是新建了一个session,所以从另外一个浏览器打开webform1,这时将会显示历史访问量和当前在线人数均为2,这个您应该能够理解。现在您关闭其中的一个浏览器,刷新没有关闭的那个浏览器,结果历史访问量和当前在线人数还是2,这个时候也许你就不能理解了,这是为什么呢?原来在关闭网页时session不会马上销毁,而是要等到超时才会被销毁,默认的超时时间是20分钟,这么长的时间您是不会等的,所以在写session_start事件时我们将超时时间设为1分钟,这样的话您只需要等一分钟就可以看到效果了,在您等了一分钟之后你再刷新那个还没有关闭的浏览器,这时你分看到当前在在线人数变成了1,这样就是合理的。所以您经平时在浏览网页时看到的在线人数只是一个大概的值,测试application_end事件。前面在每一次提到该事件时,都强调这是事件是在服务正常终止时触发,如果你关闭了电源,这样这是事件是不会被触发的,这是个必须要注意的问题。现在您打开数据库看看,你的count数据库中的count表中的count字段的值还是0,只有您在正常终止服务时,这个值才会被修改。怎么样终止服务呢?正常关机当然是可以的,但是你也许不同意,现在用另一种方法终止服务。控制面板>>管理工具>>服务,在这里找到world wide web publishing service服务,右击,在弹出的菜单中选择“停止”命令。这时你再打开数据库看看,你将会看到数据库中的count已经被修改了。而且当下一次启动服务后,运行应用程序,application_start事件将会从数据库中读出该值。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值