Session_End вызывается несколько раз в середине сеанса - PullRequest
2 голосов
/ 21 сентября 2009

Я неправильно использую Session_End?

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

Время от времени, хотя я начал видеть аномальное поведение. При загрузке страницы очень редко я вижу пустую страницу, показывающую исключение из-за того, что кеш для этой страницы пуст. Я установил точку останова отладчика в доступе к кешу и в методах session_end, надеясь перехватить ее в следующий раз, когда это произошло.

В следующий раз, когда это случилось, я был очень удивлен тем, что на самом деле происходило. Мой браузер долгое время оставался открытым, но бездействующим, поэтому я предполагаю, что у него был устаревший файл cookie сеанса. Он попадает на сервер для страницы, который помещает копию страницы в кеш. Пока страница все еще загружается, Session_End вызывается мгновенно, что удаляет ее из кэша. Если я перезагружаю браузер, Session_End продолжает вызываться, агрессивно пытаясь закрыть мой сеанс, который продолжает запрашивать плохой браузер.

Итак, я полагаю, мои настоящие вопросы:

  • Почему браузер не получает новый сеансовый файл cookie, если старый файл анафемен для IIS?
  • Session_End просто не предназначен для такого использования?
  • Есть ли лучший способ сделать то, что я пытаюсь сделать?

@ Sosh - мой global.asax.cs:

    protected void Session_End(Object sender, EventArgs e)
    {
        //clean up object cache on session expiry
        string sessionID = this.Session.SessionID;

        foreach (string key in Global.DataGroups.Keys)
        {
            if (key.EndsWith(sessionID))
            {
                Global.DataGroups.Remove(key);
            }
        }
    }

1 Ответ

1 голос
/ 23 сентября 2009

Да, есть лучший способ. Используйте встроенный объект Cache. Похоже, вы заново изобретаете колесо ... Кэш будет намного надежнее. Просто установите время истечения, чтобы соответствовать времени ожидания сеанса. Если вам приходится перезагружать кеш каждые 20 минут, ну и что?

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

...