Это произойдет, если пользователь покинет веб-сайт и будет вести онлайн-отслеживание, если пользователь будет поддерживать веб-сайт открытым. Неплохая идея, может быть, присоединиться к этому ответу с другими

м приложении есть страница, на которой всегда отображается обновленный список онлайн-пользователей. Теперь, чтобы сохранить список, который хранится в объекте приложения, обновленным, я делаю следующие шаги

добавить пользователя в список при входе

удалить пользователя при выходе

Затем, чтобы обрабатывать ситуации закрытия / перемещения браузера, у меня есть временная метка вместе с именем пользователя в коллекции. При вызове ajax каждые 90 секунд обновляется временная метка.

Проблема: мне нужно что-то чистить этот список каждые 120 секунд, чтобы удалить записи со старыми временными метками.

Как мне сделать это в моем веб-приложении? т.е. вызывать функцию каждые 2 минуты.

PS: я думал о вызове веб-службы каждые 2 минуты, используя планировщик, но среда хостинга не позволяет планировать.

Ответы на вопрос(1)

Сделайте следующее внутри глобального фильтра.

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);
 mayk21 июн. 2016 г., 09:27
Ваше решение действительно полезно и хорошо, но есть также проблема, что я использую setauthcookie для входа в систему, поэтому, если пользователь не нажимает кнопку «запомнить меня», закрытие браузера выходит из системы. Но это все еще внутри LoggedInUsers?

Ваш ответ на вопрос