Сохранение сеанса ASP.NET Open / Alive

Какой самый простой и ненавязчивый способ сохранить сеанс ASP.NET до тех пор, пока у пользователя открыто окно браузера? Приурочены ли звонки AJAX? Я хочу предотвратить следующее: иногда пользователи оставляют свое окно открытым в течение длительного времени, а затем вводят материал, и после отправки ничего не работает, потому что сеанс на стороне сервера истек. Я не хочу увеличивать значение тайм-аута более 10 минут на сервере, так как я хочу, чтобы закрытые сеансы (закрывая окно браузера) быстро сокращались.

Предложения, примеры кода?

Я использую JQuery для выполнения простого вызова AJAX для манекена HTTP-обработчика, который ничего не делает, кроме сохранения моей сессии:

function setHeartbeat() { setTimeout("heartbeat()", 300000); // every 5 min } function heartbeat() { $.get( "/SessionHeartbeat.ashx", null, function(data) { //$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :) setHeartbeat(); }, "json" ); } 

Обработчик сеанса может быть простым:

 public class SessionHeartbeatHttpHandler : IHttpHandler, IRequiresSessionState { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { context.Session["Heartbeat"] = DateTime.Now; } } 

Ключ должен добавить IRequiresSessionState, иначе сеанс не будет доступен (= null). Конечно, обработчик может также возвращать сериализованный объект JSON, если некоторые данные должны быть возвращены вызывающему JavaScript.

Доступно через web.config:

    

добавлено из balexandre 14 августа 2012 г.

Мне очень понравился этот пример, который я хочу улучшить с помощью HTML / CSS и части бит

изменить это

 //$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :) 

в

 beatHeart(2); // just a little "red flash" in the corner :) 

и добавить

 // beat the heart // 'times' (int): nr of times to beat function beatHeart(times) { var interval = setInterval(function () { $(".heartbeat").fadeIn(500, function () { $(".heartbeat").fadeOut(500); }); }, 1000); // beat every second // after n times, let's clear the interval (adding 100ms of safe gap) setTimeout(function () { clearInterval(interval); }, (1000 * times) + 100); } 

HTML и CSS

 
/* HEARBEAT */ .heartbeat { position: absolute; display: none; margin: 5px; color: red; right: 0; top: 0; }

вот живой пример только для избиения: http://jsbin.com/ibagob/1/

Если вы используете ASP.NET MVC – вам не нужен дополнительный HTTP-обработчик и некоторые модификации файла web.config. Все, что вам нужно – просто добавить некоторые простые действия в Home / Common controller:

 [HttpPost] public JsonResult KeepSessionAlive() { return new JsonResult {Data = "Success"}; } 

, напишите fragment кода JavaScript, подобный этому (я поместил его в один из файлов JavaScript сайта):

 var keepSessionAlive = false; var keepSessionAliveUrl = null; function SetupSessionUpdater(actionUrl) { keepSessionAliveUrl = actionUrl; var container = $("#body"); container.mousemove(function () { keepSessionAlive = true; }); container.keydown(function () { keepSessionAlive = true; }); CheckToKeepSessionAlive(); } function CheckToKeepSessionAlive() { setTimeout("KeepSessionAlive()", 300000); } function KeepSessionAlive() { if (keepSessionAlive && keepSessionAliveUrl != null) { $.ajax({ type: "POST", url: keepSessionAliveUrl, success: function () { keepSessionAlive = false; } }); } CheckToKeepSessionAlive(); } 

, и инициализируйте эту функциональность, вызвав функцию JavaScript:

 SetupSessionUpdater('/Home/KeepSessionAlive'); 

Пожалуйста, обратите внимание! Я реализовал эту функцию только для авторизованных пользователей (в большинстве случаев нет причин держать состояние сеанса для гостей), а решение о сохранении активного состояния сеанса основано не только на браузере, но и на авторизованном пользователе, на сайте (переместите мышь или введите некоторый ключ).

Всякий раз, когда вы делаете запрос на сервер, тайм-аут сеанса сбрасывается. Таким образом, вы можете просто сделать вызов ajax на пустой обработчик HTTP на сервере, но убедитесь, что кеш обработчика отключен, иначе браузер будет кэшировать ваш обработчик и не будет делать новый запрос.

KeepSessionAlive.ashx.cs

 public class KeepSessionAlive : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.Cache.SetCacheability(HttpCacheability.NoCache); context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); context.Response.Cache.SetNoStore(); context.Response.Cache.SetNoServerCaching(); } } 

.JS:

 window.onload = function () { setInterval("KeepSessionAlive()", 60000) } function KeepSessionAlive() { url = "/KeepSessionAlive.ashx?"; var xmlHttp = new XMLHttpRequest(); xmlHttp.open("GET", url, true); xmlHttp.send(); } 

@veggerby – Нет необходимости в накладных расходах на хранение переменных в сеансе. Достаточно предварительно запрограммировать запрос на сервер.

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

Если у вас есть проверка подлинности с помощью форм, то вы получаете что-то в файле Global.asax.cs

 FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(formsCookie.Value); if (ticket.Expired) { Request.Cookies.Remove(FormsAuthentication.FormsCookieName); FormsAuthentication.SignOut(); ... } else { ... // renew ticket if old ticket = FormsAuthentication.RenewTicketIfOld(ticket); ... } 

И вы установили срок службы билета намного дольше, чем время жизни сеанса. Если вы не аутентифицируетесь или используете другой метод проверки подлинности, есть аналогичные трюки. Веб-интерфейс Microsoft TFS и SharePoint, похоже, используют их – раздача заключается в том, что если вы нажмете ссылку на устаревшей странице, вы получите приглашения по проверке подлинности во всплывающем окне, но если вы просто используете команду, она работает.

вы можете просто написать этот код в вашем java-файле сценария, который ему нужен.

 $(document).ready(function () { window.setInterval(function () { var url = 'put the url of some Dummy page'; $.get(url); },1140000); }); 

1140000 – это время обновления, оно обновит таймаут сеанса. Тайм-аут обновления рассчитывается как время по умолчанию из iis = 20 минут, означает 20 × 60000 = 1200000 миллисекунд – 60000 миллисекунд (за одну минуту до окончания сессии) – 1140000.

Вот альтернативное решение, которое должно выжить, если клиентский компьютер переходит в hibernate.

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

После входа в систему (я делаю это в событии LoggedIn элемента управления входами)

 Dim loggedOutAfterInactivity As Integer = 999 'Minutes 'Keep the session alive as long as the authentication cookie. Session.Timeout = loggedOutAfterInactivity 'Get the authenticationTicket, decrypt and change timeout and create a new one. Dim formsAuthenticationTicketCookie As HttpCookie = _ Response.Cookies(FormsAuthentication.FormsCookieName) Dim ticket As FormsAuthenticationTicket = _ FormsAuthentication.Decrypt(formsAuthenticationTicketCookie.Value) Dim newTicket As New FormsAuthenticationTicket( ticket.Version, ticket.Name, ticket.IssueDate, ticket.IssueDate.AddMinutes(loggedOutAfterInactivity), ticket.IsPersistent, ticket.UserData) formsAuthenticationTicketCookie.Value = FormsAuthentication.Encrypt(newTicket) 

Я потратил несколько дней, пытаясь выяснить, как продлить сеанс пользователей в WebForms через всплывающее диалоговое окно, дающее пользователю возможность возобновить сеанс или позволить ему истечь. # 1 вещь, которую вам нужно знать, это то, что вам не нужны какие-либо из этих причудливых материалов «HttpContext» в некоторых других ответах. Все, что вам нужно, это $ .post (); метод. Например, во время отладки я использовал:

 $.post("http://localhost:5562/Members/Location/Default.aspx"); 

и на вашем живом сайте вы будете использовать что-то вроде:

 $.post("http://mysite/Members/Location/Default.aspx"); 

Это так просто. Кроме того, если вы хотите предложить пользователю обновить сеанс, выполните следующие действия:

   

Не забудьте добавить диалог в свой html:

   

Здесь версия плагина JQuery для решения Maryan с оптимизацией ручек. Только с JQuery 1.7+!

 (function ($) { $.fn.heartbeat = function (options) { var settings = $.extend({ // These are the defaults. events: 'mousemove keydown' , url: '/Home/KeepSessionAlive' , every: 300000 }, options); var keepSessionAlive = false , $container = $(this) , handler = function () { keepSessionAlive = true; $container.off(settings.events, handler) }, reset = function () { keepSessionAlive = false; $container.on(settings.events, handler); setTimeout(sessionAlive, settings.every); }, sessionAlive = function () { keepSessionAlive && $.ajax({ type: "POST" , url: settings.url ,success: reset }); }; reset(); return this; } })(jQuery) 

и как он импортирует в ваш * .cshtml

 $('body').heartbeat(); // Simple $('body').heartbeat({url:'@Url.Action("Home", "heartbeat")'}); // different url $('body').heartbeat({every:400000}); // different timeout 
  • Можно ли отключить HttpSession в web.xml?
  • Как запустить автономный сеанс браузера?
  • ViewExpiredException на веб-сервере с поддержкой WildFly только в определенном веб-браузере
  • Как обрабатывать сеанс в HttpClient 4.1
  • Тайм-аут аутентификации форм против тайм-аута sessionState
  • лучший способ сделать многоязычный веб-сайт codeigniter. вызов из lang-массивов зависит от сеанса lang?
  • Любой способ совместного использования состояния сеанса между различными приложениями в tomcat?
  • Каков правильный способ повторного прикрепления отдельных объектов в Hibernate?
  • Как использовать параметры, объекты запроса и сеанса, присутствующие в ActionContext?
  • Замена сеанса ASP.Net полностью
  • Переменные сеанса в ASP.NET MVC
  • Interesting Posts

    Я только что создал свой внешний жесткий диск и дал ему два раздела. Какие файлы они создали? Mac OS X

    ОС обнаружение makefile

    Что такое экземпляр Java?

    Как архивировать с помощью подкаталогов с помощью командной строки 7-Zip? Или, как я могу сохранить структуру папок во время архивации?

    Почему домашние сети с префиксом 192.168?

    Как запустить отдельный проект без отладки в Visual Studio?

    Регулярное выражение соответствует двум цифрам, необязательным десятичным, двум цифрам

    Создайте ярлык для быстрого переключения пользователей в Mac OS X

    Как я могу получить полный / абсолютный URL (с доменом) в Django?

    Доступ к структуре свойства по имени

    iPhone – Клавиатура скрывает TextField

    Работа над ошибкой MySQL «Тупик обнаружен при попытке получить блокировку; попробуйте перезапустить транзакцию “

    Использование Android Intent.ACTION_SEND для отправки электронной почты

    CSS – почему не работает процентный рост?

    C # HttpWebRequest для получения списка каталогов

    Давайте будем гением компьютера.