记录用户点击次数统计

1、Session_Start和Session_End是配对的,要不Session_End不起作用

设置session过期时间,1分钟,也就是说1分钟后用户信息(登陆信息)失效,然后在Session_End方法中保存用户这次访问记录

 <system.web>
    <sessionState mode="InProc" cookieless="false" timeout="1" />
  </system.web>

 

在Global.ascx中的Session_End方法中保存用户访问记录

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WisdomPig
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
        protected void Session_Start(object sender, EventArgs e)
        {

        }
        protected void Session_End(object sender, EventArgs e)
        {
            CommonLibrary.VisitRecord.SaveRecord(Session.SessionID);
        }
    }
}

2、重写Controller在OnActionExecuted之后执行SetRecord方法(保存用户访问的Action),用户每次访问,执行action,并记录下来

public class BaseController:Controller
    {
        protected override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);
        }
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            string controllerName = RouteData.Values["Controller"].ToString();
            string actionName=RouteData.Values["Action"].ToString();
            //Session.Timeout = 1;
            VisitRecord.SetRecord(HttpContext.Session.SessionID, controllerName, actionName, DateTime.Now, HttpContext.Request.UserHostAddress);
        }
    }

3、dtRecordTable静态私有对象,将用户的访问的action记录保存在全局的DataTable中,等待当前用户登陆过期后,利用EF保存用户信息,并在全局DataTable删除当前用户信息,防止DataTable不断增长

using DataLibrary;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace CommonLibrary
{
    public static class VisitRecord
    {
        private static DataTable dtRecordTable;
        private static object _obj = new object();
        static VisitRecord()
        {
            lock (_obj)//采用单例模式,整个系统只有一个实例化的DataTable
            {
                if (dtRecordTable == null)
                {//如果系统第一次运行,初始化DataTable,静态构造函数只执行一次
                    dtRecordTable = new DataTable("visitRecord");
                    DataColumn myColumns;
                    myColumns = new DataColumn("UserID",System.Type.GetType("System.String"));
                    dtRecordTable.Columns.Add(myColumns);
                    myColumns = new DataColumn("Controller",System.Type.GetType("System.String"));
                    dtRecordTable.Columns.Add(myColumns);
                    myColumns = new DataColumn("Action", System.Type.GetType("System.String"));
                    dtRecordTable.Columns.Add(myColumns);
                    myColumns = new DataColumn("VisitTime", System.Type.GetType("System.DateTime"));
                    dtRecordTable.Columns.Add(myColumns);
                    myColumns = new DataColumn("ClientIP", System.Type.GetType("System.String"));
                    dtRecordTable.Columns.Add(myColumns);
                }
            }
        }
        public static void SetRecord(string userID,string controller,string action,DateTime visitTime,string clientIP)
        {
            try
            {
                DataRow myRow;
                lock (dtRecordTable)//在dtRecordTable保存用户访问信息,lock锁定dtRecordTable,防止同时访问
                {
                    myRow = dtRecordTable.NewRow();
                    myRow["UserID"] = userID;
                    myRow["Controller"] = controller;
                    myRow["Action"] = action;
                    myRow["VisitTime"] = visitTime;
                    myRow["ClientIP"] = clientIP;
                    dtRecordTable.Rows.Add(myRow);
                    dtRecordTable.AcceptChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private static void ClearRecord(string userID)
        {
            try
            {
                lock (dtRecordTable)//删除用户的访问记录
                {
                    foreach (DataRow row in dtRecordTable.Rows)
                    {
                        if (row["UserID"].ToString() == userID)
                        {
                            row.Delete();
                        }
                    }
                    dtRecordTable.AcceptChanges();
                }
            }
            catch
            {
                throw;
            }
        }
        public static void SaveRecord(string userID)
        {
            if (dtRecordTable != null && dtRecordTable.Rows.Count > 0)
            {
                DataRow[] row = dtRecordTable.Select("UserID='" + userID + "'");//查找用户的访问记录
                if (row.Length > 0)
                {
                    int r = 0;
                    using (var dbContext = new DBServerEntities())//保存用户的访问记录
                    {
                        for (int i = 0; i < row.Length; i++)
                        {
                            T_VisitRecord m = new T_VisitRecord();
                            m.UserID = row[i]["UserID"].ToString();
                            m.Controller = row[i]["Controller"].ToString();
                            m.Action = row[i]["Action"].ToString();
                            m.VisitTime =DateTime.Parse(row[i]["VisitTime"].ToString());
                            m.ClientIP = row[i]["ClientIP"].ToString();
                            dbContext.T_VisitRecord.Add(m);
                        }
                        r=dbContext.SaveChanges();
                    }
                    if (r > 0)//保存成功后清除用户这次系统操作
                    {
                        ClearRecord(userID);
                    }
                }
                
            }
        }
    }
}

 

 

posted @ 2016-08-26 16:23  wjl910  阅读(1053)  评论(0)    收藏  举报