系列目錄html
上次的探討沒有任何結果,我瀏覽了大量的文章和個別系統的參考!決定用Cache來作,這可能有點難以接受可是配合mvc過濾器來作效果很是好!瀏覽器
因爲以前的過濾器咱們用過了OnActionExecuting這個方法來判斷權限緩存
如今在方法被執行後咱們用OnActionExecuted來監聽用戶的操做和刷新用戶在線列表session
首先下載http://files.cnblogs.com/ymnets/OnlineUser.7z這個類庫,代碼清晰,並加註釋mvc
這個類庫包括了操做在線用戶列表的增刪方法,你們能夠下載下來看並放到ide
能夠打開研究其代碼!測試
在App.Admin新建類OnlineHttpModulespa
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 } }
這個類在用戶登陸時被調用和在過濾器被調用,調用代碼code
過濾器:orm
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個用戶,同時也關閉瀏覽器測試用戶,準確性也不錯!拋棄了不許確的原始老方法