【发布时间】:2012-12-31 11:11:27
【问题描述】:
您好, 有人可以给我一些建议或链接,以帮助我实施以下方案。 页面将用 asp.net mvc 编写。授权将由会员实施。场景如下:
User1 刚刚登录。 同时,User2 尝试使用 成功。然后应该通知 user1 User2 刚刚登录。另外 User2 应该通知 User1 是 在线。
我怎样才能实现这样的目标?这些用户也应该可以互相写消息。 (聊天喜欢)。
【问题讨论】:
标签: asp.net-mvc
您好, 有人可以给我一些建议或链接,以帮助我实施以下方案。 页面将用 asp.net mvc 编写。授权将由会员实施。场景如下:
User1 刚刚登录。 同时,User2 尝试使用 成功。然后应该通知 user1 User2 刚刚登录。另外 User2 应该通知 User1 是 在线。
我怎样才能实现这样的目标?这些用户也应该可以互相写消息。 (聊天喜欢)。
【问题讨论】:
标签: asp.net-mvc
在 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);
}
【讨论】:
在我看来,您需要进行一些 jQuery 轮询。
您可以轻松地将 jQuery 发布到 ActionResult,然后它会在线检查用户并将 PartialView 返回给调用 jQuery 函数。
返回的 PartialView 可能让所有用户登录,然后可以在某种动画面板中弹出。
使用 javascript 执行定时轮询返回给控制器。
【讨论】:
您无法在网络中直播。您应该使用 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;
}
}
【讨论】: