【问题标题】:asp.net mvc who is onlineasp.net mvc 谁在线
【发布时间】:2012-12-31 11:11:27
【问题描述】:

您好, 有人可以给我一些建议或链接,以帮助我实施以下方案。 页面将用 asp.net mvc 编写。授权将由会员实施。场景如下:

User1 刚刚登录。 同时,User2 尝试使用 成功。然后应该通知 user1 User2 刚刚登录。另外 User2 应该通知 User1 是 在线。

我怎样才能实现这样的目标?这些用户也应该可以互相写消息。 (聊天喜欢)。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    在 asp.net 成员提供程序中有一些方法可以做到这一点,特别是 IsUserOnline() 和类似 CountUsersOnline() 的方法。这些方法的唯一问题是它们真的很蹩脚。它们取决于成员资格提供者的 LastActivityDate() 和您可以在 web.config 中设置的窗口。换句话说,如果用户最后一次与会员提供者的相遇加上 web.config 中的时间窗口尚未到期,则该用户被视为在线。

    我们采用了这个场景,并通过设置 Comet 服务器并每十分钟 ping 一次 Web 服务器来使其适合我们。 ping Web 服务器时,它会更新成员资格提供者的 LastActivityDate。

    我们将活动窗口以及会话计时器设置为 12 分钟。这使我们能够以大约十分钟的准确度确定谁在线。


    这是 Web.config 中的一行:

        <membership userIsOnlineTimeWindow="12">
    

    这里是 jQuery Comet 服务器:

      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);
        }
    

    【讨论】:

      【解决方案2】:

      在我看来,您需要进行一些 jQuery 轮询。

      您可以轻松地将 jQuery 发布到 ActionResult,然后它会在线检查用户并将 PartialView 返回给调用 jQuery 函数。

      返回的 PartialView 可能让所有用户登录,然后可以在某种动画面板中弹出。

      使用 javascript 执行定时轮询返回给控制器。

      【讨论】:

      • 是的,我正在考虑类似的解决方案,但我应该如何检查谁在线?如何创建功能(从服务器端看)
      • 想想当用户登录时,您需要编写一个数据库条目,并且在该用户的会话结束时,可能删除该条目。我想,您可以将所有登录用户保存在缓存中,并在会话结束时将其删除。无论哪种方式,我认为您需要将它们记录在某个地方并利用会话结束或其他东西
      • 好的,还有任何建议我该怎么做:“我想,你可以在 asp.net mvc 中将所有登录的用户保存在缓存中并在会话结束时将其删除”?跨度>
      【解决方案3】:

      您无法在网络中直播。您应该使用 ajax - 或 else- 刷新页面或刷新内容。所以它会解决我想。

      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);
          }
      }
      

      用户界面:

      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;
          }
      }
      

      【讨论】:

      • 以及如何实现它以便它可以定期检查(通过使用 GetUserOnlineFriends) - 比如说每两分钟 - 用户的朋友?另外如何实现这两个朋友之间聊天的可能性?
      • 不限。您可以检查 session_start 和 session_end 事件,然后在 session_start 被触发时更新用户在线 -column- 当 session_start 被触发时更新用户记录为离线 - 列 数据类型 将解决这个问题。然后如果用户在线显示他们。但是这个算法不适合你,会话会解决这个问题。我现在明白了。现在编辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      相关资源
      最近更新 更多