Silverlight中用户直接退出浏览器时如何判断用户离线
2015-02-13 14:20
302 查看
最近在修改项目中遇到了当用户直接关闭浏览器时无法判断用户离线的难题,在网上找了一天的相关资料,网上提供的方法可总结为两种:
心跳包,每间隔一段时间就传递一个当前时间,然后拿最后一个传过来的值跟当前的时间相比,如果超过了设定的值就判定该用户为离线;
在App.xaml.cs中的Exit事件中调用JS的方法,在JS方法中再去调用WCF中的方法;
第二种不明白具体该如何实现,清楚的可以留言相告一下啊!感激!!!!!
本人使用了第一种实现了,下面来具体说说:
首先在用户的类里添加了一个UserLastTime字段用来表示用户最后的活动时间并赋初值为当前时间;
然后在服务端添加一个用于记录已经登录了的用户的列表List<UserData>;
带判断用户登录成功的地方把当前登录的用户添加到List<UserData>中;
在主页面中使用DispatcherTimer 制作一个定时器来定时更新List<UserData>中当前用户的UserLastTime字段;
在需要判断用户是否已经离线的页面同样制作一个定时器来定时比较List<UserData>中当前用户的UserLastTime字段的值与当前系统时间的值,如果两值的差值超过一定的时间即可调用用法把当前用户从List<UserData>中移除。
下面来看一下具体代码:
首先是添加用户到List<UserData>中并得到整个列表:
OnlineUserList.Add(CurrentUser);//用户登录成功后添加 public List<UserData> GetOnlineUsers()//写一个方法用于返回已经登录了的所有用户 { return OnlineUserList; }
其次是在页面中定时更新UserLastTime字段的值:
DispatcherTimer Timer = new DispatcherTimer(); Timer.Interval = new TimeSpan(5000); Timer.Tick += new EventHandler(Timer_Tick); Timer.Start(); void Timer_Tick(object sender, EventArgs e) { IProxy mproxy = Factory.Service; mproxy.SetUserLastTime(CurrentUser, result => { }); } public string SetUserLastTime(UserData ud) { if (ud != null) { for (int i = 0; i < OnlineUserList.Count; i++) { if (OnlineUserList[i].Id == ud.Id) { OnlineUserList[i].UserLastTime=DateTime.Now; } } } return ""; }
最后是如果UserLastTime字段的值跟当前系统时间相差二十秒的话就将当前用户从List<UserData>中移除:
void Current_Exit(object sender, EventArgs e) { <pre name="code" class="csharp"> IProxy mproxy = Factory.Service;mproxy.OfflineUser(CurrentUser, result => { });
}
public string OfflineUser(UserData ud) { if (ud != null) { for (int i = 0; i < OnlineUserList.Count; i++) { if (OnlineUserList[i].Id== ud.Id) { OnlineUserList.Remove(OnlineUserList[i]); } } } return ""; } DispatcherTimer timer = new DispatcherTimer(); timer.Interval = new TimeSpan(3000); timer.Tick += new EventHandler(timer_Tick); timer.Start();
void timer_Tick(object sender, EventArgs e) { foreach (UserData ud in OnlineUsers) { DateTime cn = new DateTime(); cn = DateTime.Now; if (ud.UserLastTime.AddSeconds(20) < cn) { UserData ud1 = new UserData(); ud1.Id = ud.Id; ud1.Name = ou.Name; IProxy _proxy = Factory.Service; _proxy.OfflineUser(ud1, result => { }); } } <pre name="code" class="csharp"><pre name="code" class="csharp"> }
相关文章推荐
- js如何判断用户是否是用微信浏览器
- js如何判断用户是否是用微信浏览器
- PHP如何判断用户浏览器类型与语言
- 用EhCache缓存Shiro的本地会话,当用户没有安全退出就直接关闭浏览器,会话可能在缓存里孤立的问题。
- js如何判断用户是否是用微信浏览器
- js如何判断用户是否是用微信浏览器
- 如何判断用户是否关闭浏览器
- PHP如何判断用户浏览器类型与语言
- php如何判断用户通过手机wap访问还是电脑直接访问
- php如何判断用户通过手机wap访问还是电脑直接访问
- 如何不允许用户使用浏览器的『后退按钮』查看前面缓存下来的页面。
- 偷来的js 判断用户关闭浏览器或者刷新页面 ie有效
- 如何在Web页面退出前提示用户保存数据?
- 请教:建立了VSS后,想直接用域用户进行操作,请问如何实现,谢谢.
- MOSS: 如何根据AD帐号判断该用户是否属于网站用户?
- 如何在客户端判断浏览器的类型(Detecting IE7+ in JavaScript)
- 用JavaScript判断用户输入的数据是否如何要求!
- 用户控件包含一个搜索功能,但是在调用页面中按回车时无法直接提交这个表单,只有鼠标点击才提交,如何解决?
- 如何判断客户端的浏览器类型和版本号