ASP.Netにおけるウェブサイトアクセス量統計方法コード

11620 ワード

一、ユーザー情報を保存するためのデータテーブルIPStatを確立する
私がIPStatテーブルに格納しているユーザ情報には、ログインユーザのIP(IP_Address)、IPソース(IP_Src)、ログイン時間(IP_DateTime)のみが含まれており、一部のテーブルの情報本人は1日の情報しか保存しておらず、毎月の情報を統計するには1ヶ月保存しなければならない.私はデータログの操作がよく分からないので、この表を作成します.だから、私は愚かですね.ははは.
二、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データベースのデータについては、1つまたは複数のタイマを作成し、毎晩24時までの10秒以内に1日のトラフィックを統計し、削除し、統計結果を別のデータテーブルに保存し、ページに昨日のアクセス量が呼び出しであることを表示する必要があります.タイマーの作成と使用は、クリックして1つまたは複数のタイマーを作成し、参考にしてください.
以上の不都合な点は批判して指摘してください.ありがとう!
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ではタイマーを使用してオンライン人数と毎月のアクセス量を統計します
一、アプリケーションでスタートでタイマーを作成
 
  
// 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
{

}
}