前言
對於一個網站來說,統計在線人數是一個很重要的工作。平時也發現很多的網站論壇等都有在線人數的顯示。對於一個網站如果在線人數很多,用戶看到了這么個數字也是很了不起的事情。由於之前對於這個知識點只是知道,並沒有去了解過,這兩天偶然的機會又看到了,於是自己整理了一個簡單的版本,也方便讓大家來給提提意見。
本文主要通過Application和Session全局來統計在線人數,暫時只統計登錄驗證過的。實現的大致方案如下:
1、在全局應用程序啟動的時候,Application["count"]=0;初始化統計在線人數為0
2、處理一個簡單的Form登錄認證,在登錄的時候對全局變量Application["count"]進行累加1的操作。同時,在登錄的時候寫入Session值,設置一個有效的時間為1分鍾(多長時間根據需要,這里只是作為測試使用)。
3、在Session失效、用戶登出、瀏覽器關閉的情況觸發,全局的會話函數進行對全局變量Application["count"]進行累減1的操作。
有關Session的知識可以參考http://www.cnblogs.com/Jolinson/p/3604512.html
正文
第一步:新建一個Asp.Net MVC3.0的Web項目,選擇Razor引擎。設置初始在線人數。在Global.asax文件中找到Application_Start。
protected void Application_Start() { Application["count"] = 0; ///在應用程序第一次啟動時初始化在線人數為0 AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); }
第二步:簡單修改登錄驗證,認證成功,寫入Session值,並對在線人數進行加1的處理。
[HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl) { if (ModelState.IsValid) ////簡單的驗證即為登錄有效 { //會話標示寫入Session值,並設置有效時間 System.Web.HttpContext.Current.Session.Add("SessionID", Guid.NewGuid().ToString()); System.Web.HttpContext.Current.Session.Timeout = 5; ///登錄成功,對在線人數全局變量進行加1處理 System.Web.HttpContext.Current.Application["count"] = Convert.ToInt32(System.Web.HttpContext.Current.Application["count"]) + 1; if (Request.QueryString["ReturnUrl"] != null) { FormsAuthentication.RedirectFromLoginPage(model.UserName, false); } else { FormsAuthentication.SetAuthCookie(model.UserName, false); return RedirectToAction("Index", "Home"); } } return View(model); }
第三步:在全局Global.asax文件中添加Session_End中,即會話結束(登出,瀏覽器關閉,Session到期失效)
protected void Session_End(object sender, EventArgs e) { Application.Lock(); Application["count"] = Convert.ToInt32(Application["count"]) - 1; Application.UnLock(); }
這樣要要記得加鎖處理,因為可能有並發的問題。登錄的時候也要進行加鎖和解鎖的處理,上面沒加而已。
第四步:對於登出的Action進行處理如下:
public ActionResult LogOff() { FormsAuthentication.SignOut(); System.Web.HttpContext.Current.Session.Abandon();//取消當前會話 return RedirectToAction("Index", "Home"); }
取消當前會話,這樣才會觸發在上面定義的全局的Session_End函數。
第五步:在布局模版中的body標簽中添加onbeforeunload事件。
由於該事件在刷新和關閉的時候都會調用,所以在實現時做如下處理:
<script type="text/javascript"> function PageClose() { var n = window.event.screenX - window.screenLeft; var b = n > document.documentElement.scrollWidth - 20; if (b && window.event.clientY < 0 || window.event.altKey) { alert("是關閉而非刷新"); if ('@Request.IsAuthenticated' == 'True') { window.location.href = "../Account/ClosePage"; } } else { alert("是刷新而非關閉"); } } </script>
此時關閉的情況調用的Action如下:
public void ClosePage() { FormsAuthentication.SignOut(); System.Web.HttpContext.Current.Session.Abandon();//取消當前會話 }
總結
實例下載鏈接為http://pan.baidu.com/share/link?shareid=1839967473&uk=4244870074,可以下載項目,運行進行測試即可,暫時本人用IE8測試功能基本實現。針對關閉瀏覽器網頁觸發事件,兼容各個瀏覽器的問題暫未考慮,如果你對此感興趣,記得先用IE進行測試哦。如果發現問題希望及時通知,以便對方案進行更改。