一、建立一個數據表IPStat用于存放用戶信息
我在IPStat表中存放的用戶信息只包括登錄用戶的IP(IP_Address),IP來源(IP_Src)和登錄時間(IP_DateTime),些表的信息本人只保存一天的信息,如果要統計每個月的信息則要保存一個月。因為我不太懂對數據日志的操作,所以創建此表,所以說我笨吧,哈哈。
二、在Global.asax中獲取用戶信息
在Global.asax的Session_Start即新會話啟用時獲取有關的信息,同時在這里實現在線人數、訪問總人數的增量統計,代碼如下:
//獲取用戶訪問的頁面
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.
//鎖定變量
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()進行調用
參數ipAddress為用戶IP,ipSrc為用戶來源, ipDatetime為用戶進入時間。
四、創建定時器,定時操作有關數據
對以上IPSta數據庫的數據,需要創建一個或者幾個定時器,并在每天晚上24時前的10秒鐘內統計一天的流量,然后將其刪除,把統計結果保存到另一個數據表中,供頁面顯示昨日訪問量是調用。定時器的創建和使用請點擊創建一個或者幾個定時器,供你參考。
以上不妥之處請批評指正。謝謝!
在ASP.net中網站訪問量統計方法―獲取IP數據信息的類
///
/// 獲取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 中創建定時器
三、創建 myTimer過程來處理在線人數和統計每日、月、年的流量
//存儲過程名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
{
}
}
新聞熱點
疑難解答