2010-05-24 64 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