如何保持ASP.NET会话打开/激活?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (123)

只要用户打开浏览器窗口,保持ASP.NET会话的最简单和最简单的方法是什么?它是否定时AJAX调用?我想阻止以下情况:有时用户长时间打开窗口,然后输入内容,并且因为服务器端会话过期而不再提交任何内容。我不想在服务器上增加超过10分钟的超时值,因为我想关闭会话(通过关闭浏览器窗口)以快速超时。

建议,代码示例?

提问于
用户回答回答于

我使用JQuery对虚拟HTTP处理程序执行一个简单的AJAX调用,该程序除了让我的Session保持活动状态外什么也不做:

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)。如果某些数据应该返回给调用JavaScript,那么处理程序当然也可以返回JSON序列化对象。

通过web.config提供:

<httpHandlers>
    <add verb="GET,HEAD" path="SessionHeartbeat.ashx" validate="false" type="SessionHeartbeatHttpHandler"/>
</httpHandlers>

我非常喜欢这个例子,我想用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

<div class="heartbeat">&hearts;</div>

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

如果使用的是ASP.NET MVC,则不需要额外的HTTP处理程序和对web.config文件的一些修改。只需要在Home / Common控制器中添加一些简单的操作即可:

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

,写下这样一段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');

请注意!我仅为授权用户实现了此功能(在大多数情况下没有理由保留会话状态),并且决定保持会话状态为活动状态不仅仅基于 - 浏览器是否打开,但授权用户必须执行一些活动在网站上(移动鼠标或键入一些键)。

扫码关注云+社区

领取腾讯云代金券