Как получить все активные сессии из приложения asp.net - PullRequest
0 голосов
/ 17 января 2019

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

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

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

public class SessionTracker : IRegisteredObject
{
        //I created this class as singleton and exposed GetInstance method
        public void Stop(bool immediate)
        {
            //Here i want to get all the sessions and store them in database
        }

}

Зарегистрируйте его в глобальном объекте

public class Global : System.Web.HttpApplication
{

        protected void Application_Start(Object sender, EventArgs e)
        {
             HostingEnvironment.RegisterObject(SessionTracker.GetInstance());

        }
}

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

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

Также я обнаружил, что могу использовать события начала и окончания сеанса и добавлять сеансы в список объекта. Я не уверен, насколько он будет эффективен, поскольку он может занять больше памяти на стороне сервера.

Пожалуйста, предложите подход, с помощью которого я могу получить все сессии одновременно. Или это нормально, если я использую начало сеанса и событие окончания сеанса файла global.ascx.cs? Это повлияет на использование памяти?

1 Ответ

0 голосов
/ 25 января 2019

Я провел дальнейшее расследование и создал POC, чтобы проверить, создает ли он копию сеансов по ссылке или по значению.

Я обнаружил, что он создает копию по ссылке. Так что технически нет проблемы использования памяти, если я добавлю их ссылку в класс SessionTracker. Вот полная реализация класса SessionTracker, если кому-то интересно узнать об этом

public class SessionTracker : IRegisteredObject
{
    static readonly SessionTracker Tracker = new SessionTracker();
    private static readonly Dictionary<string, HttpSessionState> _sessions = new Dictionary<string, HttpSessionState>();
    private static readonly object padlock = new object();
    private SessionTracker()
    {
    }
    public void Stop(bool immediate)
    {
        try
        {
            //store them in database
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    public void AddSession(HttpSessionState session)
    {
        lock (padlock)
        {
            _sessions.Add(session.SessionID, session);
        }
    }

    public void RemoveSession(HttpSessionState session)
    {
        lock (padlock)
        {
            _sessions.Remove(session.SessionID);
        }
    }

    public static SessionTracker GetInstance()
    {
        return Tracker;
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...