一、建立一個資料表IPStat用於存放使用者資訊
我在IPStat表中存放的使用者資訊只包括登入使用者的IP(IP_Address),IP來源(IP_Src)和登入時間(IP_DateTime),些表的資訊本人只儲存一天的資訊,如果要統計每個月的資訊則要儲存一個月。因為我不太懂對資料日誌的操作,所以建立此表,所以說我笨吧,哈哈。
二、在Global.asax中擷取使用者資訊
在Global.asax的Session_Start即新會話啟用時擷取有關的資訊,同時在這裡實現線上人數、訪問總人數的增量統計,代碼如下:
void Session_Start(object sender, EventArgs e) {//擷取訪問者的IPstring 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();//為頁面訪問量+1Application["StatCount"] = int.Parse(Application["StatCount"].ToString()) + 1;//解鎖Application.UnLock();}//鎖定變數 Session.Timeout = 10; //設定逾時為10分鐘Application.Lock();Application["countSession"] = Convert.ToInt32(Application["countSession"]) + 1; //訪問總人數+1Application["onlineWhx"] = (int)Application["onlineWhx"] + 1; //線上人數加+1Session["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; //線上人數減-1Session["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"]; //將現線上人數賦於OnlineMaxApplication["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時,寫入一天的流量//初始化一個iPData Access ObjectsIPControl cont = new IPControl();//擷取今天訪問量Int32 countToday = Convert.ToInt32(cont.GetToday());//擷取本月訪問量Int32 countMonth = Convert.ToInt32(cont.GetMonth());//預存程序名sp_InsertCountPeopleDaySqlConnection 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{}}