標籤:
原文:構建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的後台管理系統(40)-精準線上人數統計實現-【過濾器+Cache】
系列目錄
上次的探討沒有任何結果,我瀏覽了大量的文章和個別系統的參考!決定用Cache來做,這可能有點難以接受但是配合mvc過濾器來做效果非常好!
由於之前的過濾器我們用過了OnActionExecuting這個方法來判斷許可權
現在在方法被執行後我們用OnActionExecuted來監聽使用者的操作和重新整理使用者線上列表
首先下載http://files.cnblogs.com/ymnets/OnlineUser.7z這個類庫,代碼清晰,並加註釋
這個類庫包括了操作線上使用者列表的增刪方法,大家可以下載下來看並放到
可以開啟研究其代碼!
在App.Admin建立類OnlineHttpModule
using App.Core.OnlineStat;using App.Models.Sys;using System;using System.Collections.Generic;using System.Globalization;using System.Linq;using System.Net.Http;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Web;using System.Web.Routing;namespace App.Admin{ public class OnlineHttpModule { // 緩衝鍵 public static readonly string g_onlineUserRecorderCacheKey = "__OnlineUserRecorder"; #region IHttpHandler 成員 public static void ProcessRequest() { // 擷取線上使用者記錄器 OnlineUserRecorder recorder = HttpContext.Current.Cache[g_onlineUserRecorderCacheKey] as OnlineUserRecorder; if (recorder == null) { // 建立記錄器工廠 OnlineUserRecorderFactory factory = new OnlineUserRecorderFactory(); // 設定使用者逾時時間 factory.UserTimeOutMinute = 2; // 統計時間間隔 factory.StatisticEventInterval = 20; // 建立記錄器 recorder = factory.Create(); // 緩衝記錄器 HttpContext.Current.Cache.Insert(g_onlineUserRecorderCacheKey, recorder); } OnlineUser user = new OnlineUser(); AccountModel model = (AccountModel)HttpContext.Current.Session["Account"];//注意session的名稱是和登入儲存的名稱一致 // 使用者名稱稱 user.UserName = Convert.ToString(model.Id); // SessionID user.SessionID = HttpContext.Current.Session.SessionID; // IP 位址 user.ClientIP = HttpContext.Current.Request.UserHostAddress; // 最後啟用時間 user.ActiveTime = DateTime.Now; // 最後請求地址 user.RequestURL = HttpContext.Current.Request.RawUrl; // 儲存使用者資訊 recorder.Persist(user); } #endregion }}
這個類在使用者登入時被調用和在過濾器被調用,調用代碼
過濾器:
public class SupportFilterAttribute : ActionFilterAttribute { public string ActionName { get; set; } private string Area; // 方法被執行後的更新線上使用者列表 public override void OnActionExecuted(ActionExecutedContext filterContext) { OnlineHttpModule.ProcessRequest(); }......................................
登入時候的設定:
AccountModel account = new AccountModel(); account.Id = user.Id; account.TrueName = user.TrueName; account.Photo = string.IsNullOrEmpty(user.Photo)?"/Images/Photo.jpg":user.Photo; Session["Account"] = account; //線上使用者統計 OnlineHttpModule.ProcessRequest();
調用非常簡單,實現非常簡單!
現在看看如果擷取線上列表:
// 綁定線上使用者列表 IList<OnlineUser> userList = recorder.GetUserList(); foreach (var OnlineUser in userList) { sb.AppendFormat(OnlineUser.UserName+"<br>"); }
OnlineHttpModule可以自由設定統計的間隔(秒),和使用者逾時的時間,這很精準的統計了使用者2分鐘無操作被視為離線!
我分別用IE和chome測試了2個使用者,同時也關閉瀏覽器測試使用者,準確性也不錯!拋棄了不準確的原始老方法
構建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的後台管理系統(40)-精準線上人數統計實現-【過濾器+Cache】