记录用户点击次数统计
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); } } } } } }


浙公网安备 33010602011771号