分享好友 最新动态首页 最新动态分类 切换频道
网站访问量统计
2024-11-07 22:58

我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address,IP来源(IP_Src)和登录时间(IP_DateTime,些表的信息本人只保存一天的信息,如果要统计每个月的信息则要保存一个月。因为我不太懂对数据日志的操作,所以创建此表,所以说我笨吧,哈哈。

网站访问量统计

二、在Global.asax中获取用户信息

Global.asax的Session_Start即新会话启用时获取有关的信息,同时在这里实现在线人数、访问总人数的增量统计,代码如下

void Session_Start(object sender, EventArgs e) { //获取访问者的IP string ipAddress = Request.ServerVariables["REMOTE_ADDR"]; //获取访问者的来源 string ipSrc; //判断是否从搜索引擎导航过来的 if (Request.UrlReferrer == null) { ipSrc = ""; } else { //获取来源地址 ipSrc = Request.UrlReferrer.ToString(); } //获取访问时间 DateTime ipDatetime = DateTime.Now; //保存IP信息到数据库中 IPControl cont = new IPControl(); cont.AddIP(ipAddress, ipSrc, ipDatetime);

//获取用户访问的页面 string pageurl = Request.Url.ToString(); //判断访问的是否是默认页 if (pageurl.EndsWith("IPStat.aspx")) { //锁定变量 Application.Lock(); //为页面访问量+1 Application["StatCount"] = int.Parse(Application["StatCount"].ToString()) + 1; //解锁 Application.UnLock(); }

//锁定变量 Session.Timeout = 10; //设定超时为10分钟 Application.Lock(); Application["countSession"] = Convert.ToInt32(Application["countSession"]) + 1;  //访问总人数1 Application["onlineWhx"] = (int)Application["onlineWhx"] + 1; //在线人数加1 Session["login_name"] = null; //解锁 Application.UnLock(); }

提醒一句,别忘了下面的代码,以实现在用户离线时,将在线人数减去1.

void Session_End(object sender, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 //锁定变量 Application.Lock(); Application["onlineWhx"] = (int)Application["onlineWhx"] - 1; //在线人数减1 Session["login_name"] = null; //解锁 Application.UnLock(); }

三、将以上有关信息保存到数据库IPStat

创建了一个获取IP数据信息的类IPControl(),用来实现对数据库IPStat数据的操作,关于IPControl()类的内容,因为它是C#中对数据库的操作,以解Sql server 数据库,就能看懂它,这里就不作介绍了,请点击该链接查看。

为了实现将用户IP信息存入数据库,在上面代码中对IPControl()进行调用

//保存IP信息到数据库中 IPControl cont = new IPControl(); cont.AddIP(ipAddress, ipSrc, ipDatetime);

参数ipAddress为用户IP,ipSrc为用户来源, ipDatetime为用户进入时间。

四、创建定时器,定时操作有关数据

对以上IPSta数据库的数据,需要创建一个或者几个定时器,并在每天晚上24时前的10秒钟内统计一天的流量,然后将其删除,把统计结果保存到另一个数据表中,供页面显示昨日访问量是调用。定时器的创建和使用请点击创建一个或者几个定时器,供你参考。

以上不妥之处请批评指正。谢谢

在ASP.net中网站访问量统计方法—获取IP数据信息的类

using System; using System.Data; using System.Data.SqlClient; using System.Text;

///

/// 获取IP数据信息的类 /// public class IPControl { //常量用来表示T-SQL语句中用到的变量名称 private const string PARM_IP_ADDRESS = "@IPAddress"; private const string PARM_IP_SRC = "@IPSrc"; private const string PARM_IP_DATETIME = "@IPDateTime"; //T-SQL语句 private const string SQL_INSERT_IPSTAT = "INSERT INTO IPStat VALUES(@IPAddress,@IPSrc,@IPDateTime)"; private const string SQL_DELETe_IPSTAT = "delete from IPStat WHERe DATEDIFF(d,ip_datetime,getdate())>30"; //只保留一个月的数据 private const string SQL_SELECt_TOTAL = "SELECT COUNT(*) FROM IPStat "; private const string SQL_SELECt_TODAY = "SELECT COUNT(*) FROM IPStat WHERe DATEDIFF(d,ip_datetime,getdate())=0"; private const string SQL_SELECt_YESTERDAY = "SELECT COUNT(*) FROM IPStat WHERe DATEDIFF(d,ip_datetime,getdate())=1"; private const string SQL_SELECt_MonTH = "SELECT COUNT(*) FROM IPStat WHERe DATEDIFF(d,ip_datetime,getdate())<30 and DATEDIFF(mm,ip_datetime,getdate())=0"; public IPControl() { } /// /// 保存IP数据信息到数据库 /// /// /// public void AddIP(string ipAddress,string ipSrc,DateTime ipDatetime) { //构建连接语句字符串 StringBuilder strSQL = new StringBuilder(); //创建表示QQ号的参数 SqlParameter[] parms = new SqlParameter[] { new SqlParameter(PARM_IP_ADDRESS, SqlDbType.NVarChar, 20), new SqlParameter(PARM_IP_SRC, SqlDbType.NVarChar,80), new SqlParameter(PARM_IP_DATETIME, SqlDbType.DateTime)}; SqlCommand cmd = new SqlCommand();

// 依次给参数赋值,并添加到执行语句中 parms[0].Value = ipAddress; parms[1].Value = ipSrc; parms[2].Value = ipDatetime; foreach(SqlParameter parm in parms) cmd.Parameters.Add(parm);

//定义对象资源保存的范围,一旦using范围结束,将释放对方所占的资源 using (SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringLocalTransaction)) { //在执行字符串中加载插入语句 strSQL.Append(SQL_INSERT_IPSTAT); conn.Open();

//设定SqlCommand的属性 cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = strSQL.ToString(); //执行SqlCommand命令 cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); //如果执行成功,返回true,否则false。 } } public string GetTotal() { //调用SqlHelper访问组件的方法返回第一行第一列的值 object count = SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_TOTAL, null); //返回统计结果 return count.ToString(); } public string GetToday() { //调用SqlHelper访问组件的方法返回第一行第一列的值 object count = SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_TODAY, null); //返回统计结果 return count.ToString(); } public string GetYesterday() { //调用SqlHelper访问组件的方法返回第一行第一列的值 object count = SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_YESTERDAY, null); //返回统计结果 return count.ToString(); } public string GetMonth() { //调用SqlHelper访问组件的方法返回第一行第一列的值 object count = SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_MONTH, null); //返回统计结果 return count.ToString(); } }

在Global.asax中使用定时器来统计在线人数和每天每月的访问量

一、在 Application_Start 中创建定时器

//以下为使用多个定时器System.Timers.Timer的处理方法 //用thread重新包一下,定义两个定时器 System.Threading.Thread myTimer_1 = new System.Threading.Thread(new System.Threading.ThreadStart(write_1)); myTimer_1.Start(); System.Threading.Thread myTimer_2 = new System.Threading.Thread(new System.Threading.ThreadStart(write_2)); myTimer_2.Start();

二、使用定时器每10分钟更新一次在线人数检查一次是否要存入一天流量的信息

//使用第一个定时器,每10分钟更新一次在线人数 private void write_1() { //以下使用System.Timers.Timer类 每间隔10分钟存一次数据 System.Timers.Timer myTimer1 = new System.Timers.Timer(600000); //实例化Timer类,设置间隔时间为600000毫秒(10分钟存一次总人数); myTimer1.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件; myTimer1.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed); //到达时间的时候执行事件myTimer_Elapsed; myTimer1.AutoReset = true; //设置是执行一次(false)还是一直执行(true); } //使用第二个定时器, private void write_2() { //以下使用System.Timers.Timer类 每间隔10分钟检查一次是否要存入一天流量的信息 System.Timers.Timer myTimer2 = new System.Timers.Timer(600000); //实例化Timer类,设置间隔时间为600000毫秒(10分钟存一次总人数); myTimer2.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件; myTimer2.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_peopleDay); //到达时间的时候执行事件myTimer_peopleDay; myTimer2.AutoReset = true; //设置是执行一次(false)还是一直执行(true); }

三、创建 myTimer过程来处理在线人数和统计每日、月、年的流量

//创建 myTimer_Elapsed 过程并定义第一个定时器事件,要用来处理在线人数的代码 private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //如果现在的在现人数大于原有的在现人数,则替换数据表中的在现人数 int Maxonline = Convert.ToInt32(Application["OnlineMax"]); int Minonline = Convert.ToInt32(Application["OnlineWhx"]); if (Maxonline < MinOnline) { SqlConnection con = Db.DB.createconnection(); con.Open(); SqlCommand cmd = new SqlCommand("update countpeople set totol='" + Application["countSession"].ToString() + "',OnLine=+'" + Application["onlineWhx"] + "',DataTimes='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'", con); cmd.ExecuteNonQuery(); con.Close(); Application["OnlineMax"] = Application["OnlineWhx"]; //将现在线人数赋于onlineMax Application["dataTimes"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } else { //将总访问人数写入数据库 SqlConnection con = Db.DB.createconnection(); con.Open(); SqlCommand cmd = new SqlCommand("update countpeople set totol=" + Application["countSession"].ToString(), con); cmd.ExecuteNonQuery(); con.Close(); } } //创建 myTimer_peopleDay 过程并定义第二个定时器事件,要用来统计每日、月、年的流量 private void myTimer_peopleDay(object sender, System.Timers.ElapsedEventArgs e) { try { //当天晚上24时 if (DateTime.Now.Hour == 23) { if (DateTime.Now.Minute >= 50) { //当天晚上24时,写入一天的流量 //初始化一个iP数据访问对象 IPControl cont = new IPControl(); //获取今天访问量 Int32 countToday = Convert.ToInt32(cont.GetToday()); //获取本月访问量 Int32 countMonth = Convert.ToInt32(cont.GetMonth());

//存储过程名sp_InsertCountPeopleDay SqlConnection con1 = Db.DB.createconnection(); con1.Open(); SqlCommand cmd1 = new SqlCommand("sp_InsertCountPeopleDay", con1); cmd1.CommandType = CommandType.StoredProcedure; //存储过程名

//调用并设置存储过程参数 cmd1.Parameters.Add(new SqlParameter("@peopleDay", SqlDbType.Int)); cmd1.Parameters.Add(new SqlParameter("@dateTimes", SqlDbType.DateTime));

//给参数赋值 cmd1.Parameters["@peopleDay"].Value = countToday; cmd1.Parameters["@dateTimes"].Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

cmd1.ExecuteNonQuery(); con1.Close();

//在一个月的最后一天写入本月的访问量 //取本月最后一天(30或者31日) DateTime lastDay = Convert.ToDateTime(DateTime.Now.AddMonths(1).ToString("yyyy-MM-01")).AddDays(-1); int lastDay1 = DateTime.Now.Day; //取当前时间的日期 if (lastDay1.ToString() == lastDay.ToString()) //如果前日期等于本月最后一天的日期,则前本月的流量写入数据库 { SqlConnection conM = Db.DB.createconnection(); conM.Open(); SqlCommand cmdM = new SqlCommand("sp_InsertCountPeopleMonth", conM); cmdM.CommandType = CommandType.StoredProcedure; //存储过程名

//调用并设置存储过程参数 cmdM.Parameters.Add(new SqlParameter("@peopleMonth", SqlDbType.Int)); cmdM.Parameters.Add(new SqlParameter("@dateTimeMonth", SqlDbType.DateTime));

//给参数赋值 cmdM.Parameters["@peopleMonth"].Value = countMonth; cmdM.Parameters["@dateTimeMonth"].Value = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

cmdM.ExecuteNonQuery(); conM.Close(); } } } } catch {

最新文章
虫虫SEO教程,介绍搜索引擎优化之路,助力企业腾飞
随着互联网的飞速发展,搜索引擎优化()已成为企业提升品牌知名度、扩大市场份额的重要手段。虫虫SEO,作为我国SEO领域的佼佼者,为广大企业和SEO从业者提供了丰富的实战经验。本文将结合虫虫SEO教程,为大家揭秘搜索引擎优化之道,助力企
百度首页排名优化价格—推广加微信,排名1-3天上首页!
我司是专业的分享信息发布平台,拥有众多高权重网站,擅长通过百度霸屏策略实现流量最大化,并配备智能系统自动挖掘高流量关键词。我们能在短时间内迅速提升排名,确保流量稳定增长。针对您面临的排名波动、效果评估难、内容优化挑战、流量
掌握SEO竞争分析利器,助力企业乘风破浪,脱颖而出
本摘要揭示了网站SEO竞争分析工具的重要性,该工具助力企业通过深入分析竞争对手,精准定位自身SEO策略,从而在激烈的市场竞争中占据有利地位,实现脱颖而出。网站SEO竞争分析工具概览网站SEO竞争分析工具是一种运用技术手段,对竞争对手网
成品网站1.1.719如何助力中小企业高效打造品牌网站?平台表示:将为大家深入分析其优势与特色。
在互联网经济高速发展的今天,中小企业正面临如何快速、高效建立品牌网站的巨大挑战。成品网站1.1.719凭借其强大的功能和灵活的设计,成为中小企业打造线上品牌的不二选择。这款工具不仅降低了建站门槛,还提供了丰富的功能模块,帮助企业
文案写手小红书:打造爆款笔记的秘籍395
在小红书这个内容营销沃土上,文案写手扮演着至关重要的角色。优质的文案,能够吸引用户目光、激发互动、促成转化。本文将针对文案写手小红书写作,分享打造爆款笔记的秘诀,助力你成为小红书内容营销达人。掌握小红书文案独家风格小红书文
如何做Amazon英文的Niche站—完整建设案例(上)
本文作者由月关飞燕撰写,很早之前的文章,但是还是可以在现在,特别是2019年的今天,一些方法和思维,都可以参考,期望会对大家有所帮助。推荐完之后呢,接下来就要告诉大家,如果你想去做一个完整的英文的Niche站,应该如何去做?本文的
基金应知应会的基础知识试题
基金应知应会的基础知识试题均为单项选择题,其中包括普通单项选择题和组合型单选选择题两种,题量为50个题,80%正确率为合格标准。根据中国证券投资基金业协会《》得知,协会制定并定期更新应知应会考核大纲及试卷。考核内容包括基金法律
怎样关闭百度推送信息功能-怎么关闭百度的推送功能
在当今数字化的时代,我们常常会被各种推送信息所困扰,其中百度推送信息也可能会在不经意间打扰到我们的生活,究竟怎样关闭百度推送信息功能呢?下面就为大家详细介绍。打开百度浏览器,在浏览器的右上角找到设置图标,通常是一个齿轮状的
ai生成影视解说文案技巧教程:自动生成器与使用
在数字化浪潮的推动下人工智能技术已经渗透到影视行业的方方面面。影视解说文案作为影片推广的要紧环节其优劣直接关系到观众的兴趣和影片的票房。如今生成影视解说文案的技术应运而生它不仅可以增进工作效率还能保证文案的优劣和创新性。本
guid硬盘格式如何设置bios
文章目录浅谈分区格式MBR与GPT区别前言一、硬盘的物理结构二、MBR是什么?三、GPT是什么?总结 电脑硬盘分区格式一共有两种,一种是GUID(GPT),一种是MBR。 这里先介绍硬盘的物理结构: 磁头(Heads):每张磁片的正反两面各有一个磁头,一
相关文章
推荐文章
发表评论
0评