只要用户打开了浏览器窗口,哪种方法最容易且最不引起干扰的方法就是保持ASP.NET会话的活动状态?是定时的AJAX通话吗?我要防止出现以下情况:有时用户将其窗口长时间打开,然后输入内容,并且由于服务器端会话已过期,因此提交后再无任何作用。我不想在服务器上将超时值增加超过10分钟,因为我希望关闭的会话(通过关闭浏览器窗口)可以快速超时。
建议,代码示例?
我使用JQuery对虚拟HTTP处理程序执行简单的AJAX调用,该处理程序除了使我的Session保持活动之外什么都不做:
function setHeartbeat() { setTimeout("heartbeat()", 5*60*1000); // 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,否则Session将不可用(= null)。如果某些数据应返回到调用JavaScript,则处理程序当然也可以返回JSON序列化对象。
通过web.config提供:
<httpHandlers> <add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeatHttpHandler"/> </httpHandlers>
添加 从balexandre于2012年8月14日
我非常喜欢这个示例,因此我想通过HTML / CSS和Beat部分进行改进
改变这个
//$("#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
<div class="heartbeat">♥</div> /* HEARBEAT */ .heartbeat { position: absolute; display: none; margin: 5px; color: red; right: 0; top: 0; }
这是仅一个跳动部分的 实时示例 :http : //jsbin.com/ibagob/1/