ASP.NET如何统计昨天的点击率、今天的点击率和历史总点击率?
ASP.NET网站的详细日志通常由IIS提供,日志的目录可以在IIS信息服务管理器中配置。但是,这些日志文件以txt文件的形式存在。如果你想在ASP.NET使用它们,你需要编写特殊的分析和统计代码。但是这样会增加复杂度,效率也达不到要求,因为分析平面文件要花很多时间。有时候我们不需要它的详细信息,只需要统计每天的总点击量或者每页的点击量。如果每个页面都需要等待很长时间,这显然是不能接受的。
所以我们考虑把统计当天总点击量的代码写在masterPage里,然后写入数据库,这样每个网页的点击量都可以统计出来;写统计每个网页中单个页面点击率的代码,然后写入数据库。这当然是可以的,但是会影响性能,因为你每点击一个网页,都要从数据库中读取当前点击率,加上1再写回来。如果存在并发,数据库将锁定数据并阻止下一次访问,直到上一个命令结束。这是为了防止灰尘。如果有很多并发,可能会影响性能。
所以新的思路是,母版页和单个网页中的统计代码并不是提前读取数据库,而是将信息写入httpapplicationstate,即每次点击,httpapplicationstate中的值增加1。因为HttpAppplicationState存储在内存中,所以操作它比直接操作数据库要快得多。然后启动线程池计时器(系统。Threading.Timer)放在Global.asax中的Application_Start函数中,并让计时器的处理函数每5秒检查一次HttpAppplicationState中的数据。如果有数据,先读取数据库中的数据并在httpapplicationstate中添加数据,然后写回数据库,将数据写入数据库后清空httpapplicationstate。这样做的好处是处理程序在一个新的线程中处理数据,不占用ASP的时间。NET的网页;消除并发访问。
注意要在Global.asax的Application_End中增加一个处理程序,保证在应用关闭后,时间间隔还没到的情况下,HttpApplicationState中的数据能成功写入数据库,而不丢失点击率的统计。
鉴于当天的总点击率和每个页面的总点击率,可以将操作HttpApplicationState的函数重构合并为一个函数,放在一个helper类中。功能代码如下:
public void AddValueToApplication(http application state application,string dictionaryName,string itemName)
{
if(字符串。IsNullOrEmpty(itemName))返回;
申请。lock();
字典& ltstring,int & gtlist =新词典& ltstring,int & gt();
if (application[dictionaryName]!=空)
{
list =(字典& ltstring,int & gt)应用程序[dictionary name];
如果(列表。ContainsKey(项目名))
list[itemName]++;
其他
列表。Add(itemName,1);
}
其他
{
列表。Add(itemName,1);
}
application[dictionary name]= list;
申请。UnLock();
}
以上函数通过Dictionary保存点击率,参数dictionaryName表示要统计的项目名称,如“当天总点击率”、“单页点击率”;参数itemName表示要计数的项目的具体项目名称。对于当天的点击率,itemname的可能值为“2010-10-19”,对于单个页面的点击率,itemName的可能值为“xxx.aspx”。这些页面通常通过ASP.NET路由动态生成。
在masterPage和每个页面中,只需要调用这个函数就可以实现HttpapplicationState的操作。
2.统计在线用户数:包括在线登录用户和匿名用户。
通过统计会话id的数量来判断在线人数。这些用户有些是登录用户,有些是匿名用户。通过Page.User.IsAuthenticate判断登录用户和匿名用户。
统计在线人数比统计点击率更复杂,但它们的统计方式是一样的,即先将数据写入HttpapplicationState,然后在Global.asax中注册计时器处理程序,再将HttpApplicationState中的数据写入计时器处理程序中的数据库。