asp.net如何统计昨日点击率、今日点击率、历史总共点击率
我想在自己的网站首页加入这个功能最好能有一整段完整的代码,请高手不吝赐教,如果程序能用,还有重赏感谢这位高手的回答,可是你这段代码我直接加到首页里,好像不能用吧。。。。...
我想在自己的网站首页加入这个功能
最好能有一整段完整的代码,请高手不吝赐教,如果程序能用,还有重赏
感谢这位高手的回答,可是你这段代码我直接加到首页里,好像不能用吧。。。。 展开
最好能有一整段完整的代码,请高手不吝赐教,如果程序能用,还有重赏
感谢这位高手的回答,可是你这段代码我直接加到首页里,好像不能用吧。。。。 展开
2个回答
展开全部
统计点击率:包括统计站点总的点击率,当日总点击率和每页的点击率
ASP.NET网站的详细日志通常是由IIS提供的,日志的目录可以在IIS信息服务管理器配置。但是这些日志文件是以txt文件存在的,如果要在ASP.NET使用它需要专门编写分析和统计代码。但是这样做一是增加复杂度,二是效率上达不到要求,因为分析平面文件需要大量的时间,有时我们并不是需要它的详细信息,只是仅仅需要统计每天总的点击量或者每个网页的点击量,如果每点一个网页都需要等好长时间,这显然是不行的。
所以我们考虑在masterPage页中写入统计当日总点击量的代码,然后写入数据库,这样可以使每个网页的点击都统计到;在每个网页中编写统计单页点击率的代码,然后写入数据库。这样做当然是可以的,但是这样会影响性能,因为每点击一次网页都要从数据库中读取当前点击率并且加1然后写回去,如果有并发的话,数据库会对数据加锁,会阻塞后面一个访问,直到前面的命令结束,这是为了防止脏,如果并发很多的话,可能会影响性能。
所以新的思路是:masterPage和单个网页中的统计代码并不事先读取数据库,而是向HttpApplicationState中写入信息,即每点击一次,HttpApplicationState中的值增加1,由于HttpApplicationState保存在内存中,所以对它做操作比直接对数据库操作速度要快的多。然后在Global.asax中Application_Start函数中启动线程池计时器(System.Threading.Timer),让计时器的处理函数每隔5秒检查一次HttpApplicationState中的数据,有数据则先读取数据库中的数据加上HttpApplicationState中的数据,然后写回数据库中,把数据写入数据库后即清空HttpApplicationState。这样做的好处是,处理函数是在新的线程中处理数据的,不占用ASP.NET网页的时间;消除并发访问情况。
注意,还要在Global.asax的Application_End中加入处理函数,以保证在应用程序关闭后,而时间间隔还没有到的情况下,能够将HttpApplicationState中的数据顺利写入数据库,而不丢失点击率的统计。
针对当日总点击率和每页的总点击率这两种情况,操作HttpApplicationState的函数可以通过重构合并为一个函数,放在一个helper类中, 函数代码如下:
public void AddValueToApplication(HttpApplicationState application, string dictionaryName, string itemName)
{
if (string.IsNullOrEmpty(itemName)) return;
application.Lock();
Dictionary<string, int> list = new Dictionary<string, int>();
if (application[dictionaryName] != null)
{
list = (Dictionary<string, int>)application[dictionaryName];
if (list.ContainsKey(itemName))
list[itemName]++;
else
list.Add(itemName, 1);
}
else
{
list.Add(itemName, 1);
}
application[dictionaryName] = list;
application.UnLock();
}
上面这个函数是通过Dictionary来保存点击率的,参数dictionaryName表示要统计的项目名,比如“当日总点击率”,“单页点击率”;参数itemName表示要统计的项目的具体小项名,对于“当日点击率”,itemName的可能值为“2010-10-19”,对于“单页点击率”,itemName的可能值为页名“xxx.aspx”,这些页一般是通过ASP.NET 路由动态生成的动态页,其物理页可能只有一个,因此调用此函数的代码不必每页都写一次。
在masterPage页和每页中只需调用该函数实现对HttpapplicationState的操作。
2.统计在线用户数:包括在线登录用户和匿名用户
判断在线用户的个数是通过统计SessionID的数量实现的,这些用户中有的是已登录用户,有的是匿名用户,判断登录用户和匿名用户是通过Page.User.IsAuthenticate实现的。
统计在线用户数比统计点击率复杂,但是他们的统计模式不变,即首先将数据写入HttpApplicationState,然后再Global.asax中注册计时器处理程序,接着在计时器处理程序中将HttpapplicationState中的数据写入数据库。
ASP.NET网站的详细日志通常是由IIS提供的,日志的目录可以在IIS信息服务管理器配置。但是这些日志文件是以txt文件存在的,如果要在ASP.NET使用它需要专门编写分析和统计代码。但是这样做一是增加复杂度,二是效率上达不到要求,因为分析平面文件需要大量的时间,有时我们并不是需要它的详细信息,只是仅仅需要统计每天总的点击量或者每个网页的点击量,如果每点一个网页都需要等好长时间,这显然是不行的。
所以我们考虑在masterPage页中写入统计当日总点击量的代码,然后写入数据库,这样可以使每个网页的点击都统计到;在每个网页中编写统计单页点击率的代码,然后写入数据库。这样做当然是可以的,但是这样会影响性能,因为每点击一次网页都要从数据库中读取当前点击率并且加1然后写回去,如果有并发的话,数据库会对数据加锁,会阻塞后面一个访问,直到前面的命令结束,这是为了防止脏,如果并发很多的话,可能会影响性能。
所以新的思路是:masterPage和单个网页中的统计代码并不事先读取数据库,而是向HttpApplicationState中写入信息,即每点击一次,HttpApplicationState中的值增加1,由于HttpApplicationState保存在内存中,所以对它做操作比直接对数据库操作速度要快的多。然后在Global.asax中Application_Start函数中启动线程池计时器(System.Threading.Timer),让计时器的处理函数每隔5秒检查一次HttpApplicationState中的数据,有数据则先读取数据库中的数据加上HttpApplicationState中的数据,然后写回数据库中,把数据写入数据库后即清空HttpApplicationState。这样做的好处是,处理函数是在新的线程中处理数据的,不占用ASP.NET网页的时间;消除并发访问情况。
注意,还要在Global.asax的Application_End中加入处理函数,以保证在应用程序关闭后,而时间间隔还没有到的情况下,能够将HttpApplicationState中的数据顺利写入数据库,而不丢失点击率的统计。
针对当日总点击率和每页的总点击率这两种情况,操作HttpApplicationState的函数可以通过重构合并为一个函数,放在一个helper类中, 函数代码如下:
public void AddValueToApplication(HttpApplicationState application, string dictionaryName, string itemName)
{
if (string.IsNullOrEmpty(itemName)) return;
application.Lock();
Dictionary<string, int> list = new Dictionary<string, int>();
if (application[dictionaryName] != null)
{
list = (Dictionary<string, int>)application[dictionaryName];
if (list.ContainsKey(itemName))
list[itemName]++;
else
list.Add(itemName, 1);
}
else
{
list.Add(itemName, 1);
}
application[dictionaryName] = list;
application.UnLock();
}
上面这个函数是通过Dictionary来保存点击率的,参数dictionaryName表示要统计的项目名,比如“当日总点击率”,“单页点击率”;参数itemName表示要统计的项目的具体小项名,对于“当日点击率”,itemName的可能值为“2010-10-19”,对于“单页点击率”,itemName的可能值为页名“xxx.aspx”,这些页一般是通过ASP.NET 路由动态生成的动态页,其物理页可能只有一个,因此调用此函数的代码不必每页都写一次。
在masterPage页和每页中只需调用该函数实现对HttpapplicationState的操作。
2.统计在线用户数:包括在线登录用户和匿名用户
判断在线用户的个数是通过统计SessionID的数量实现的,这些用户中有的是已登录用户,有的是匿名用户,判断登录用户和匿名用户是通过Page.User.IsAuthenticate实现的。
统计在线用户数比统计点击率复杂,但是他们的统计模式不变,即首先将数据写入HttpApplicationState,然后再Global.asax中注册计时器处理程序,接着在计时器处理程序中将HttpapplicationState中的数据写入数据库。
展开全部
添加文件“global.asax”在根目录下
覆盖里面的内容
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
//应用程序启动时运行的代码
Application["count"] = 0;
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
}
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
//对Appliaction加锁以防止并行性
Application.Lock();
//增加一个在线人数
Application["count"] = (int)Application["count"] + 1;
//解锁
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
Application.Lock();
//减少一个在线人数
Application["count"] = (int)Application["count"] - 1;
Application.UnLock();
}
</script>
覆盖里面的内容
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
//应用程序启动时运行的代码
Application["count"] = 0;
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
}
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
//对Appliaction加锁以防止并行性
Application.Lock();
//增加一个在线人数
Application["count"] = (int)Application["count"] + 1;
//解锁
Application.UnLock();
}
void Session_End(object sender, EventArgs e)
{
Application.Lock();
//减少一个在线人数
Application["count"] = (int)Application["count"] - 1;
Application.UnLock();
}
</script>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询