我正在开发一个网络电视和视频流媒体门户,只能由注册用户访问。现在我想查看保存在数据库中的在线/离线用户列表。用户不需要通过观看电视频道或视频来移动页面,因此我认为上次活动时间没有帮助。我是否需要ping mac地址或类似的东西? 我搜遍了所有的论坛,但仍未找到合适的解决方案。
答案 0 :(得分:0)
许多开发人员倾向于使用‘Session_End’
事件将用户标记为“离线”,但这可能不是一个好主意,因为ASP.Net会话与之间没有一对一的映射关系用户。例如,如果用户在其工作站上打开2个独立的Internet Explorer实例(例如,2个独立的IE进程),则可以打开2个ASP.Net会话。其中一个会话的‘Session_End’
事件并不一定意味着用户处于离线状态,他们仍然可以使用该网站。
此外,‘Session_End’
事件仅在“InProc”会话模式下可用。如果您尝试在State Server或SQL Server中存储会话状态,“Session_End”事件,它将永远不会触发。
我建议使用上次访问时间作为理想方法。
成员资格有助于构建用户数据库,有一种方便的方法可以通过Membership.GetUser(stringuserName).IsOnline.
获取它
如果您不使用成员资格,您可以使用以下方法,该方法在成员资格中使用相同的原则:
在应用程序中,您可以定义全局字典membershipDictionary以在线和离线存储有关用户的信息。
在页面中使用AJAX
计时器(或简称XmlHttpRequest
在客户端JavaScript中)来更新用户的LastVisitTime并按间隔将其存储到membershipDictionary中。
有时,访问字典membershipDictionary以过滤掉空闲用户(他们长时间未访问该页面),并检索有多少用户仍在线的信息。可以在单独的线程或基于服务器的计时器中进行定期维护。还请注意线程同步问题。
答案 1 :(得分:0)
SignalR可能适合此操作。
您可以拥有一个所有用户都连接到的集线器,然后每个用户都会不时地调用集线器上的方法(适当的间隔将是主观的)。
您需要将每个用户加入一个组,当用户不在该时间间隔内轮询时,您将从该组中删除该用户,并将该用户标记为离线。