2015-10-14 1 views
0

В моем проекте ASP.NET, я использую «» InProc состояния сеанса для управления сеансами и текущего истечения устанавливается как -ASP.NET «InProc» - выполнить код яваскрипта в конце

 <sessionState mode="InProc" timeout="1" ></sessionState> 

т.е. тайм-аут сеанса составляет 1 минуту.

В конце «простоя» 1 минуту приложение перенаправляется на просмотр или страницу с истекшим сроком действия.

Прежде чем это перенаправление произойдет, я хочу выполнить код javascript в том же контексте контроллера. Еще один момент заключается в том, что код истечения срока действия сеанса вызывается из других мест, кроме встроенного механизма фрейма.

Я попытался создать функцию «опрос» javascript, чтобы проверить тайм-аут сеанса, а затем выполнить что-то при аннулировании сеанса, но то, что это делает, заключается в повторной проверке сеанса каждый раз, когда выполняется вызов xhr.

Основная идея состоит в том, чтобы код javascript был проинформирован о тайм-ауте сеанса через какой-либо механизм. База кода является существующей и довольно большой для нового .NET-разработчика, такого как я, чтобы понять.

Любая помощь приветствуется.

+0

Если вы вступаете в какое-либо взаимодействие с сервером в течение текущего сеанса, сеанс всегда будет расширяться. Все это должно произойти на клиенте без вызова сервера – haraman

+1

Взгляните на событие '' onbeforeunload' '(http://www.w3schools.com/jsref/event_onbeforeunload.asp). Это может быть то, что вам нужно. –

+0

@haraman - вы правы. Любой вызов сервера продлевает сеанс. Чтобы сделать все это на клиенте, мне пришлось бы ввести логику проверки «без дела» на клиенте, что в дополнение к тому, что сервер уже делает. Не уверен, что это правильное решение. – FrailWords

ответ

0

Я использовал следующий подход, чтобы предупредить пользователей, за 2 минуты до тайм-аута сеанса 20 минут, чтобы они могли сохранить свою работу и продолжать в течение 2 минут, в противном случае их изменения будут потеряны

<script type = "text/javascript"> 
var sessionTimeoutWarning = 18; 
var sessionTimeout = '<%= Session.Timeout %>'; 
var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000; 
setTimeout('SessionWarning()', sTimeout); 

function SessionWarning() { 
    var message = "Your current session will expire in " + (parseInt(sessionTimeout) - parseInt(sessionTimeoutWarning)) + " mins!\nPlease Save any unsaved changes before the session expires"; 
    var userid = '<%= Session("User_ID") %>'; 
    if (userid == '') {} else { 
    if (parseInt(userid) > 0) { 
     alert(message); 
    } 
    } 
} 
</script> 

Сво Приложение веб-форм ASP.NET, вышеупомянутый блок сценариев был вставлен на главную страницу и доступен на всех вспомогательных страницах.

Session("User_ID") - это переменная, которая хранит в настоящее время идентификатор пользователя, который должен быть положительным, отличным от нуля. Логика, если она пуста, равна нулю или не положительна, не отображает сообщение.

+0

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

+0

Можете ли вы объяснить, что такое «простоя» тайм-аута? – haraman

+0

«Idle» timeout - это когда нет взаимодействия с браузером, в котором приложение работает, либо с помощью мыши, либо с клавиатуры - в основном пользовательские взаимодействия в течение определенного периода времени. – FrailWords