ASP.NET MVC5+EF6+EasyUI 後臺管理系統(40)-精準在線人數統計實現-【過濾器+Cache】

系列目錄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個用戶,同時也關閉瀏覽器測試用戶,準確性也不錯!拋棄了不許確的原始老方法

相關文章
相關標籤/搜索