Как избежать исключения HttpException из-за тайм-аута

Я работаю над веб-сайтом, работающим на коде .NET asp/C#. Клиенты требуют, чтобы сеансы имели 25-минутный тайм-аут. Однако иногда сайт используется, и пользователь остается на связи в течение длительного периода времени (более 25 минут). Session_End срабатывает:

protected void Session_End(Object sender, EventArgs e)
{
    Hashtable trackingInformaiton = (Hashtable)Application["trackingInformation"];
    trackingInformaiton.Remove(Session["trackingID"]);
}

Через некоторое время пользователь возвращается, но когда он взаимодействует с веб-сайтом, он получает сообщение об ошибке, и мы получаем это уведомление по электронной почте:

Пользователь: неавторизованный пользователь

Ошибка: System.Web.HttpException

Описание: Не удалось загрузить состояние просмотра. Дерево элементов управления, в которое загружается состояние представления, должно соответствовать дереву элементов управления, которое использовалось для сохранения состояния представления во время предыдущего запроса...

Важная часть трассировки стека — System.Web.UI.Control.AddedControl. Судя по всему, сервер выбросил данные сессии и отправляет новые данные, а клиент пытается разобраться со старыми данными. Отсюда и ошибка, что "the control tree into which viewstate is being loaded [doesn't] match the control tree that was used to save the viewstate during the prevoius request."

Итак, вот вопрос. Как я могу принудительно указать браузеру пользователя перенаправлять на экран, когда вы вышли из системы, когда время ожидания соединения истекло? (Это что-то, что я должен добавить в метод Session_End?)


person Dan Burton    schedule 26.04.2010    source источник


Ответы (3)


Еще проще использовать метатег Html «обновить». Следующая строка сработает через 5 минут после загрузки страницы:

<meta http-equiv="refresh" content="300;url=http://domain.org/Logout.aspx" />

Может быть, это то, что вам нужно.

person Michael A. Volz aka Flynn    schedule 18.07.2010

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

person LesterDove    schedule 27.04.2010

что-то вроде функции javascript setTimeout.

например в функции загрузки страницы

setTimeout("перенаправление()", 1500000); // 25-минутный тайм-аут

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

person Chad    schedule 16.07.2010