一尘不染

保持ASP.NET会话开放/有效

c#

只要用户打开了浏览器窗口,哪种方法最容易且最不引起干扰的方法就是保持ASP.NET会话的活动状态?是定时的AJAX通话吗?我要防止出现以下情况:有时用户将其窗口长时间打开,然后输入内容,并且由于服务器端会话已过期,因此提交后再无任何作用。我不想在服务器上将超时值增加超过10分钟,因为我希望关闭的会话(通过关闭浏览器窗口)可以快速超时。

建议,代码示例?


阅读 256

收藏
2020-05-19

共1个答案

一尘不染

我使用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">&hearts;</div>

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

这是仅一个跳动部分的 实时示例http :
//jsbin.com/ibagob/1/

2020-05-19