我正在使用MVC4,我想要做的是检查用户的朋友的状态,看看他们是否在线以进行聊天。我已经探索了WebSecurity
和MEmebership
类,但看不到其中的任何功能。从IIS服务器获取会话是否必须执行某些操作?
提前致谢
答案 0 :(得分:3)
有MembershipUser.IsOnline Property但如果这没用,您可以使用signlR检查当前状态,并可能将其存储在某处。
另外,你可以每隔几分钟做一次ajax调用来检查用户状态并将其存储在某个地方。
答案 1 :(得分:3)
我建议你的一个可能的解决方案是创建一个全局过滤器,填充每个用户的LastActionTime
字段,然后使用此字段来确定用户是否在线:
首先在DateTime?
类中创建一个名为LastActionTime
的{{1}}类型的新属性,以防您使用Code-First方法。如果您使用的是Database-First方法,只需在User
表中添加可为空的DateTime列并更新您的本地模型。
Users
然后创建一个名为public class User
{
// ...
public DateTime? LastActionTime { get; set; }
// ...
}
的新类,并实现它的LogUserActionTimeFilter
和OnActionExecuting
方法。如果您有任何服务或DbContexts,请在类的构造函数中初始化它们。
OnActionExecuted
public class LogUserActionTimeFilter : IActionFilter
{
private readonly IUserAuthService userAuthService;
public LogAdminRequestFilter()
: this(new UserAuthService())
{
}
public LogAdminRequestFilter(IUserAuthService userAuthService)
{
this.userAuthService = userAuthService;
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
this.userAuthService.SaveCurrentTimeAsLastActionTime(
filterContext.HttpContext.User.Identity.Name);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
方法只是将SaveCurrentTimeAsLastActionTime
设置为给定用户的LastActionTime
并保存更改。它应该很容易实现。
完成过滤后,您可以将其应用于特定操作,控制器(例如仅限聊天)或全局:
DateTime.Now
当您需要确定用户是否在线时,只需检查其public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new LogUserActionTimeFilter());
}
}
列/属性,如果它在LastActionTime
之前小于5分钟(例如),则可以考虑用户在线。