2010-05-24 39 views
9

問候, 有人可以給我一些建議或鏈接,這將有助於我實現以下情況。 頁面將被寫入asp.net mvc。授權將由會員實施。該方案是如下:asp.net mvc誰在線

用戶1剛剛記錄在 一段時間後,用戶2試圖與 成功登錄。然後user1應該被通知 User2剛剛登錄。此外,User2 應該被通知User1是 在線。

我該如何做到這一點?這些用戶也應該可以相互寫消息。 (聊天像)。

回答

6

有方法在asp.net成員資格提供程序中執行此操作,特別是IsUserOnline()和CountUsersOnline()之類的操作。這些方法唯一的問題是他們真的很蹩腳。它們取決於成員資格提供者的LastActivityDate()和您可以在web.config中設置的窗口。換句話說,如果用戶最後一次遇到成員資格提供者加上web.config中的時間窗口未過期,則認爲該用戶在線。

我們通過設置一個Comet服務器並每10分鐘ping一次Web服務器,我們就採用了這個scenairo,並使它適用於我們。當Web服務器被ping通時,它會更新成員資格提供者的LastActivityDate。

我們將活動窗口設置爲12分鐘以及會話計時器。這使我們能夠確定誰在線的準確性大約爲十分鐘。


這是Web中的行。配置:

<membership userIsOnlineTimeWindow="12"> 

這裏是jQuery的彗星服務器:

function getData() { 
    $.getJSON("/Account/Timer", gotData); 
    } 

    // Whenever a query stops, start a new one.  
    $(document).ajaxStop(getData, 600000); 

    // Start the first query. 
    getData(); 

這裏是我們的服務器代碼:

public JsonResult Timer() 
    { 
      MembershipUser user = Membership.GetUser(User.Name); 
      user.LastActivityDate = DateTime.Now; 

      Membership.UpdateUser(user); 

      // You can return anything to reset the timer. 
      return Json(new { Timer = "reset" }, JsonRequestBehavior.AllowGet); 
    } 
+0

我在哪裏添加這個服務器代碼? – DoIt 2014-02-06 18:53:05

3

聽起來像你需要一些jQuery輪詢發生。

你可以輕鬆地做一個jQuery發佈到ActionResult,然後檢查用戶在線並返回一個PartialView回調用jQuery函數。

返回的PartialView可能會讓所有用戶登錄,然後可以在某種動畫面板中彈出。

使用javascript執行定時輪詢回控制器。

+0

是的,我想類似的解決方案,但如何我應該檢查誰在線?如何創建一個功能(從服務器端看) – 2010-05-25 06:01:08

+0

認爲用戶登錄時需要編寫一個數據庫條目並在該用戶的會話結束時刪除該條目。 你可以,我想,保持所有登錄的用戶在緩存中,並在會話結束時刪除它們。無論哪種方式,我認爲你需要將它們記錄到某處並利用會話結束或其他什麼東西 – griegs 2010-05-25 06:18:42

+0

好的,以及任何暗示我該如何做到這一點:「我猜可以將所有登錄的用戶保存在緩存中,並在會話結束時將其刪除「在asp.net mvc? – 2010-05-25 06:25:43

2

您無法在網上獲得在線在線。您應該刷新頁面或使用ajax或其他方式刷新內容。所以它會解決我的想法。

ps。聊天和在線問題,你有兩種選擇;你可以將它們存儲在數據庫 - 它是我的建議 - 或存儲在內存中,你可能想看看this

表:

Users 
-Id/int - identity 
-LoginTime/datetime 
-IsOnline/bit 

Friends 
-Id/int - identity 
-FirstUserId/int 
-SecondUserId/int 

public class UserInformation 
{ 
    public IList<User> OnlineFriends { get; set;} 
    public IList<User> JustLoggedFriends { get; set; } /* For notifications */ 
} 

public class UserRepository 
{ 
    public UserInformation GetInformation(int id, DateTime lastCheck) 
    { 
     return Session.Linq<User>() 
       .Where(u => u.Id == id) 
       .Select(u => new { 
           User = u, 
           Friends = u.Friends.Where(f => f.FirstUser.Id == u.Id || f.SecondUser.Id == u.Id) 
       }) 
       .Select(a => new UserInformation { 
           JustLoggedFriends = u.Friends.Where(f => f.IsOnline && f.OnlineTime >= lastCheck).ToList(), 
           OnlineFriends = u.Friends.Where(f => f.IsOnline).ToList() 
       }) 
       .ToList(); 
    } 
} 

public class UserService 
{ 
    public UserInformation GetInformation(int id, DateTime lastCheck) 
    { 
     return repository.GetInformation(id, lastCheck); 
    } 
} 

UI:

public class UserController 
{ 
    public ActionResult Index() 
    { 
     var userId = (int)Session["UserId"]; 
     var lastCheck = (DateTime)Session["LastCheck"]; 
     UserInformation info = userService.GetInformation(userId, lastCheck); 
     Session["LastCheck"] = DateTime.Now; 

     //show up notifications and online users. 
    } 
    public ActionResult Login() 
    { 
     User user = null; // TODO: get user by username and password 
     Session["UserId"] = user.Id; 
     Session["LastCheck"] = DateTime.Now; 
    } 
} 
+0

以及如何實現它,以便它可以定期檢查(通過使用GetUserOnlineFriends) - 比方說每兩分鐘 - 用戶的朋友?另外如何實現這兩個朋友之間聊天的可能性? – 2010-05-25 11:28:36

+0

不限。你可以檢查session_start和session_end事件,然後在線更新用戶-column-當session_start被觸發時,當end的被觸發的更新用戶記錄爲離線時 - column_data類型的bit_會解決這個問題。然後如果用戶在線顯示他們。但是這個算法不適合你,會話會解決這個問題。我現在明白了。現在編輯。 – cem 2010-05-25 15:46:32