Session_End вызывается несколько раз в середине сеанса

Я использую 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 ответ

Решение

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

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

Другие вопросы по тегам