【问题标题】:how to alive session as long as possible in asp.net 3.5如何在 asp.net 3.5 中尽可能长时间地激活会话
【发布时间】:2014-05-16 10:35:15
【问题描述】:

我正在使用 asp.net 3.5。我只想尽可能长时间地进行会话(浏览器关闭)。这里我只是按照以下步骤操作:

1) 会话超时值更改为 Web 配置失败。 2) 使用一些外部 .ashx 文件并在母版页使用 javascript 调用如下技术:

<%@ WebHandler Language="C#" Class="SessionHeartbeat" %>

using System;
using System.Web;
using System.Web.SessionState;
public class SessionHeartbeat : IHttpHandler, IRequiresSessionState
{
   public void ProcessRequest(HttpContext context)
    {
        context.Session["Heartbeat"] = DateTime.Now;
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
 }

母版页上的这个 javascript:

     <script type="text/javascript">
    function setHeartbeat() {
    setTimeout("heartbeat()", 300000); // every 5 min
}

function heartbeat() {
     $.post(
        "../SessionHeartbeat.ashx?Timestamp" + new Date().toString()",
        null,
        function(data) {
            //$("#heartbeat").show().fadeOut(1000); // just a little "red flash" in the corner :)
            setHeartbeat();
        },
        "json"
    );
}
</script>

但这并没有给我想要的结果。 请帮帮我...

------------------------------------已更新-------- --------------------------------

我在这里修改我的 jquery :

 <script type="text/javascript">
    function setHeartbeat() {
    setTimeout("heartbeat()", 300000); // every 5 min
}

function heartbeat() {
     $.get(
        "../SessionHeartbeat.ashx",
        null,
        function(data) {
           beatHeart(2); // just a little "red flash" in the corner :)
            setHeartbeat();
        },
        "json"
    );
}
// 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);
}
</script>

----------------------已更新--------- -------------------------------------------

【问题讨论】:

  • 尝试使用 $.post??以及为什么你调用 setHeartbeat();从get call成功??
  • 您为什么要这样做?您是在单台计算机上运行网络还是使用网络农场?无论哪种方式,会话状态都是通过会话 cookie 维护的(默认情况下)——客户端发送会话 cookie,服务器识别 cookie 并从内存中获取会话状态。如果我清除此 cookie,无论您在服务器端做什么,会话都会丢失。还要注意客户端缓存 - 添加某种“/SessionHeartbeat.ashx?Timestamp”+ new Date().toString() 而不是静态 url。
  • 我假设您的描述中的意思是浏览器最小化而不是浏览器关闭。如果您希望会话在用户没有活动的情况下保持活动状态(即他们没有浏览网站,保持滑动窗口打开)在您的“心跳”中返回一些随机数据。我们使用这种技术在我们的 web.config 中有一个小的(低于 1 小时)滑动会话,但是在我们知道用户没有活动的某个页面上,会话必须无限期保持打开状态(阅读长文档)。我们每 30 秒检测一次并返回 4-8k 的随机文本,这对我们来说完美无缺
  • 能否包含 web.config 的相关部分?
  • @freefaller 我还没有尝试过多个浏览器。如果我们最终将其投入生产,我会发表评论,我认为我暂时不会有时间测试所有内容。我需要得到一些现实世界的关注,将我的到期时间设置回 45 分钟并正确完成它。但它确实似乎有 2 分钟的超时时间。

标签: c# javascript asp.net session


【解决方案1】:

这是 OP 的一个工作示例。

Web.config - 设置较小的测试超时时间

<sessionState mode="InProc" timeout="2"/>

Javscript(在本示例的页面中)

<script type="text/javascript">
    var interval = null;
    (function() {
        // keep me alive
        interval = setInterval(function (){
            $.get('keepalive.ashx', function (d) {
                $('#response').append(d + '<br/>');
            });
        }, 30000);
    })();


 // If we want to stop the interval....
    function Stop() {
        clearInterval(interval);
    }
</script>

这会在名为 response 的元素中打印 sessionId,以便我们可以看到会话 ID。

keepalive.ashx 通用处理程序(需要 System.Web.SessionState)

public class keepalive : IHttpHandler, IRequiresSessionState {

    public void ProcessRequest (HttpContext context) {
        if (context.User.Identity.IsAuthenticated)
        {
            // authenticated sessions
            context.Response.ContentType = "text/plain";
            context.Response.Write("Auth:" + context.Session.SessionID);
        }
        else
        {
            // guest
            context.Response.ContentType = "text/plain";
            context.Response.Write("NoAuth:" + context.Session.SessionID);
        }
    }

注意:没有被问到的一件事是您的 keepalive 是否应该在经过身份验证的会话上运行?如果是这样,我想知道是否还有cookie过期问题?

【讨论】:

  • 它不起作用..当我必须从根文件夹和管理文件夹的母版页中定位此文件时,我必须编写类似 $.get('../keepalive.ashx', function (d) { 或 $.get('~/keepalive.ashx', function (d) {
  • 正确,您必须计算出相对路径。波浪号 (~) 是服务器端功能,因此除非您在服务器端注入脚本并执行 Server.MapPath 来计算出您在 javascript 中的波浪号的相对位置,否则将无法实现任何目标。
  • 我怎么知道这是在后台成功运行。
  • 在 Chrome 中,网络选项卡中的 Ctrl+Shift+j 可以跟踪会话工作。
  • 有关更多详细信息,我包括一张带有当前页面会话密钥的快照。
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2017-01-08
  • 2019-09-15
相关资源
最近更新 更多