Какой самый простой и ненавязчивый способ поддерживать сеанс ASP.NET в рабочем состоянии, пока у пользователя открыто окно браузера? Это вызовы AJAX по времени? Я хочу предотвратить следующее: иногда пользователи оставляют свои окна открытыми в течение длительного времени, затем вводят что-то, и при отправке ничего больше не работает, потому что сеанс на стороне сервера истек. Я не хочу увеличивать значение тайм-аута на сервере более чем на 10 минут, поскольку я хочу, чтобы закрытые сеансы (путем закрытия окна браузера) быстро истекали.
Предложения, образцы кода?
Ответы:
Я использую JQuery для выполнения простого вызова AJAX фиктивного HTTP-обработчика, который ничего не делает, кроме поддержания активности моего сеанса:
Обработчик сеанса может быть очень простым:
Ключ - добавить IRequiresSessionState, иначе сеанс не будет доступен (= null). Обработчик, конечно, также может вернуть сериализованный объект JSON, если некоторые данные должны быть возвращены вызывающему JavaScript.
Доступно через web.config:
добавлено от balexandre на 14 августа, 2012
Мне так понравился этот пример, что я хочу улучшить его с помощью HTML / CSS и части битов.
изменить это
в
и добавить
HTML и CSS
вот живой пример только для части биений: http://jsbin.com/ibagob/1/
источник
DateTime.Now
заключалась в том, чтобы указать, когда сеанс последний раз обновлялся, с помощью тактового импульса.Если вы используете ASP.NET MVC - вам не нужен дополнительный обработчик HTTP и некоторые модификации файла web.config. Все, что вам нужно - просто добавить простое действие в контроллер Home / Common:
напишите фрагмент кода JavaScript, подобный этому (я поместил его в один из файлов JavaScript сайта):
и инициализируйте эту функцию, вызвав функцию JavaScript:
Пожалуйста, обратите внимание! Я реализовал эту функцию только для авторизованных пользователей (в большинстве случаев нет причин сохранять состояние сеанса для гостей), и решение сохранить состояние сеанса активным основано не только на том, открыт браузер или нет, но авторизованный пользователь должен выполнять некоторые действия на сайте (наведите курсор мыши или нажмите какую-нибудь клавишу).
источник
@Url.Action("KeepSessionAlive","Home")
функцию инициализатора, чтобы вам не приходилось жестко кодировать URL-адрес, а также вставлять первый блок внутри IIFE и просто экспортировать,SetupSessionUpdater
поскольку это единственное, что нужно вызывать извне - что-то вроде это: SessionUpdater.jssetInterval(KeepSessionAlive, 300000)
Каждый раз, когда вы делаете запрос к серверу, тайм-аут сеанса сбрасывается. Таким образом, вы можете просто выполнить ajax-вызов пустого обработчика HTTP на сервере, но убедитесь, что кеш обработчика отключен, иначе браузер кэширует ваш обработчик и не будет делать новый запрос.
KeepSessionAlive.ashx.cs
.JS:
@veggerby - нет необходимости в хранении переменных в сеансе. Достаточно просто выполнить запрос к серверу.
источник
Вам действительно нужно сохранить сеанс (есть ли в нем данные?) Или этого достаточно, чтобы подделать это, восстановив сеанс при поступлении запроса? Если первое, используйте метод, описанный выше. Если второе, попробуйте что-нибудь вроде использования обработчика событий Session_End.
Если у вас есть проверка подлинности с помощью форм, вы получите что-то в Global.asax.cs, например
И вы устанавливаете время жизни билета намного больше, чем время жизни сеанса. Если вы не аутентифицируетесь или используете другой метод аутентификации, есть аналогичные уловки. Веб-интерфейс Microsoft TFS и SharePoint, похоже, используют их - отдача в том, что если вы щелкнете ссылку на устаревшей странице, вы получите запросы аутентификации во всплывающем окне, но если вы просто используете команду, это работает.
источник
вы можете просто написать этот код в своем файле сценария java, который и есть.
Время
(20-1)*60*1000
обновления, оно обновит тайм-аут сеанса. Таймаут обновления рассчитывается как время по умолчанию из iis = 20 минут, что означает 20 × 60000 = 1200000 миллисекунд - 60000 миллисекунд (за одну минуту до истечения сеанса) составляет 1140000.источник
Вот альтернативное решение, которое должно выжить, если клиентский компьютер перейдет в спящий режим.
Если у вас огромное количество зарегистрированных пользователей, используйте это осторожно, так как это может съесть много памяти сервера.
После входа в систему (я делаю это в событии LoggedIn элемента управления входом)
источник
Я потратил несколько дней, пытаясь выяснить, как продлить сеанс пользователя в WebForms с помощью всплывающего диалогового окна, дающего пользователю возможность возобновить сеанс или позволить ему истечь. Вещь №1, которую вам нужно знать, - это то, что вам не нужен какой-либо из этих причудливых вещей «HttpContext», происходящих в некоторых других ответах. Все, что вам нужно, это jQuery's $ .post (); метод. Например, при отладке я использовал:
и на своем действующем сайте вы должны использовать что-то вроде:
Это так просто. Кроме того, если вы хотите предложить пользователю возможность возобновить сеанс, выполните следующие действия:
Не забудьте добавить диалог в свой html:
источник
Что касается решения Veggerby, если вы пытаетесь реализовать его в приложении VB, будьте осторожны, пытаясь запустить предоставленный код через переводчик. Следующее будет работать:
Кроме того, вместо вызова функции heartbeat (), например:
Вместо этого назовите это так:
Номер один, setTimeout срабатывает только один раз, тогда как setInterval срабатывает повторно. Номер два: вызов heartbeat () как строки у меня не сработал, тогда как вызов его как реальной функции сработал.
И я могу на 100% подтвердить, что это решение преодолеет нелепое решение GoDaddy о принудительном 5-минутном сеансе пула приложений в Plesk!
источник
Здесь версия плагина JQuery решения Maryan с оптимизацией дескрипторов. Только с JQuery 1.7+!
и как он импортирует в ваш * .cshtml
источник
[Поздно на вечеринку ...]
Другой способ сделать это без накладных расходов на вызов Ajax или обработчик WebService - загрузить специальную страницу ASPX через заданный промежуток времени (то есть до тайм-аута состояния сеанса, который обычно составляет 20 минут):
KeepAlive.aspx
Страница просто пустая страница , которая не делает ничего , кроме прикосновения / обновитьSession
состояние:Это работает, создавая
img
элемент (изображение) и заставляя браузер загружать его содержимое соKeepAlive.aspx
страницы. Загрузка этой страницы заставляет сервер касаться (обновлять)Session
объект, увеличивая скользящее временное окно окончания сеанса (обычно еще на 20 минут). Фактическое содержимое веб-страницы удаляется браузером.Альтернативный и, возможно, более чистый способ сделать это - создать новый
iframe
элемент и загрузить в негоKeepAlive.aspx
страницу.iframe
Элемент скрыт, например, сделав его дочерний элемент скрытогоdiv
элемента где - то на этой странице.Активность на самой странице можно обнаружить путем перехвата действий мыши и клавиатуры для всего тела страницы:
Я не могу поверить в эту идею; см. https://www.codeproject.com/Articles/227382/Alert-Session-Time-out-in-ASP-Net .
источник