1. Erstellen Sie eine Datentabelle IPStat, um Benutzerinformationen zu speichern
Die Benutzerinformationen, die ich in der IPStat-Tabelle speichere, umfassen nur die IP (IP_Address), die IP-Quelle (IP_Src) und die Anmeldezeit ( IP_DateTime) ), speichere ich die Informationen dieser Tabellen nur für einen Tag. Wenn ich die Informationen für jeden Monat zählen möchte, speichere ich sie für einen Monat. Ich habe diese Tabelle erstellt, weil ich nicht viel über die Funktionsweise von Datenprotokollen weiß. Nennen Sie mich also dumm, haha.
2. Erhalten Sie Benutzerinformationen in Global.asax
Erhalten Sie relevante Informationen, wenn der Session_Start von Global.asax aktiviert ist, d. h. wenn eine neue Sitzung aktiviert wird, und gleichzeitig Um die Anzahl der Online-Personen und die Gesamtzahl der Besucher zu erhöhen, lautet der Code wie folgt:
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(); }
Zur Erinnerung: Vergessen Sie nicht den folgenden Code, um die Anzahl der Online-Personen zu reduzieren um 1, wenn der Benutzer offline ist.
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(); }
3. Speichern Sie die oben genannten relevanten Informationen in der Datenbank IPStat
erstellt eine Klasse IPControl(), um IP-Dateninformationen zu erhalten, die dazu verwendet werden Betreiben Sie die Datenbank-IPStat-Daten, da sie in C# vorliegen. Sie können die Funktionsweise der Datenbank verstehen, indem Sie sie hier nicht vorstellen Es.
Um die Benutzer-IP-Informationen in der Datenbank zu speichern, rufen Sie IPControl() im obigen Code auf
//保存IP信息到数据库中 IPControl cont = new IPControl(); cont.AddIP(ipAddress, ipSrc, ipDatetime);
Der Parameter ipAddress ist die Benutzer-IP, ipSrc ist die Benutzerquelle und ipDatetime ist die Benutzereintrittszeit.
4. Erstellen Sie Timer und verarbeiten Sie regelmäßig relevante Daten.
Für die oben genannten IPSta-Datenbankdaten müssen Sie einen oder mehrere Timer erstellen und diese jede Nacht innerhalb von 10 Sekunden vor 24:00 Uhr einstellen Datenverkehr für einen Tag, löschen Sie ihn dann und speichern Sie die statistischen Ergebnisse in einer anderen Datentabelle, damit auf der Seite die Anzahl der Besuche von gestern angezeigt wird. Um Timer zu erstellen und zu verwenden, klicken Sie bitte auf „Erstellen eines oder mehrerer Timer“ als Referenz.
Bitte kritisieren und korrigieren Sie alle oben genannten Unangemessenheiten. Danke!
Statistikmethode für Website-Besuche in ASP.net – Klasse zum Erhalten von IP-Dateninformationen
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(); } }
Verwenden Sie den Timer in Global.asax, um die Anzahl der Online-Personen sowie das tägliche und monatliche Besuchsvolumen zu zählen
1. Erstellen Sie einen Timer in 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();
2. Aktualisieren Sie mit dem Timer die Anzahl der Personen, die alle 10 Minuten online sind, und prüfen Sie, ob Sie die Verkehrsinformationen für einen Tag speichern möchten
//使用第一个定时器,每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); }
3. Erstellen Sie den myTimer-Prozess, um die Anzahl der Personen online zu verarbeiten und den täglichen, monatlichen und jährlichen Verkehr zu zählen
//创建 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 { } }
Weitere Artikel zur Website-Verkehrsstatistikmethode Code in ASP.net, achten Sie bitte auf die chinesische PHP-Website!