gpt4 book ai didi

asp.net - 在asp.net mvc中获取在线用户列表

转载 作者:行者123 更新时间:2023-12-02 16:44:48 24 4
gpt4 key购买 nike

我的应用程序中有一个页面,它始终显示更新的在线用户列表。现在,为了保持存储在应用程序对象中的列表更新,我执行以下步骤

  1. 登录时将用户添加到列表

  2. 注销时删除用户

  3. 然后为了处理浏览器关闭/导航离开的情况,我有一个时间戳以及集合中的用户名每 90 秒调用一次 ajax 更新时间戳。

问题:我需要每 120 秒清理一次此列表,以删除具有旧时间戳的条目。

如何在我的网络应用程序中执行此操作?即每 2 分钟调用一次函数。

PS:我想过使用调度程序每 2 分钟调用一次 Web 服务,但托管环境不允许任何调度。

最佳答案

在全局过滤器内执行以下操作。

public class TrackLoginsFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Dictionary<string, DateTime> loggedInUsers = SecurityHelper.GetLoggedInUsers();

if (HttpContext.Current.User.Identity.IsAuthenticated )
{
if (loggedInUsers.ContainsKey(HttpContext.Current.User.Identity.Name))
{
loggedInUsers[HttpContext.Current.User.Identity.Name] = System.DateTime.Now;
}
else
{
loggedInUsers.Add(HttpContext.Current.User.Identity.Name, System.DateTime.Now);
}

}

// remove users where time exceeds session timeout
var keys = loggedInUsers.Where(u => DateTime.Now.Subtract(u.Value).Minutes >
HttpContext.Current.Session.Timeout).Select(u => u.Key);
foreach (var key in keys)
{
loggedInUsers.Remove(key);
}

}
}

检索用户列表

public static class SecurityHelper
{
public static Dictionary<string, DateTime> GetLoggedInUsers()
{
Dictionary<string, DateTime> loggedInUsers = new Dictionary<string, DateTime>();

if (HttpContext.Current != null)
{
loggedInUsers = (Dictionary<string, DateTime>)HttpContext.Current.Application["loggedinusers"];
if (loggedInUsers == null)
{
loggedInUsers = new Dictionary<string, DateTime>();
HttpContext.Current.Application["loggedinusers"] = loggedInUsers;
}
}
return loggedInUsers;

}
}

不要忘记在 global.asax 中注册您的过滤器。通过应用程序设置来关闭此功能可能是个好主意。

GlobalFilters.Filters.Add(new TrackLoginsFilter());

还可以在注销时删除用户以更加准确。

SecurityHelper.GetLoggedInUsers().Remove(WebSecurity.CurrentUserName);

关于asp.net - 在asp.net mvc中获取在线用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4774347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com