0

我有一个使用 JQuery 作为我的前端代码和 ASP.NET 作为我的后端 Web 服务的 Web 应用程序。

我设置了 web.config 设置 <sessionState timeout="1">。当用户登录时,Web 服务会使用用户名创建一个会话变量。

System.Web.HttpContext.Current.Session["UserID"] = user_id;

在我的网络服务中,我有一个检查变量是否仍然存在的函数。

[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = true)]
public string GetSessionUserID()
{
    string user_id = "";
    if (System.Web.HttpContext.Current.Session["UserID"] != null)
    {
        user_id = System.Web.HttpContext.Current.Session["UserID"].ToString();
    }
    return user_id;
}

我有一个 JS 函数,它调用调用GetSessionUserID().

$(document).ready(function () {
            getSessionID();
            setInterval(getSessionID, 3000);
        function getSessionID() {
            console.log("getSessionID");
            $.ajax({
                url: "photoapp.asmx/GetSessionUserID",
                //data: ,
                success: OnGetSessionIDSuccess,
                error: OnGetSessionIDError
            });
        }
        function OnGetSessionIDSuccess(data, status) {
            console.log("Success OnGetSessionIDSuccess");
            console.log(data);
            var strUser = $(data).find("string").text();
            console.log(strUser);
            if (strUser == "") {
                window.location = "login.html";
            }
        }
}

在文档准备功能中,我还调用setInterval()了它将每 3 秒检查一次会话。

测试时,getSessionID每 3 秒调用一次,但一分钟后,可以找到 getSessionID 用户变量。我希望在一分钟完成后将用户重定向回 l​​ogin.html。为什么会话变量在一分钟后仍然存在?我对 ASP.Net 会话状态有什么不了解?如何解决这个问题?

4

1 回答 1

0

请注意,如果您采用 SQL Server 来保存会话状态,那么会话超时事件将永远不会被调用,因此您无法知道或判断用户是否确实已注销。

唯一可能的解决方案是确保所有网页都有某种心跳或例程,每分钟左右调用一次服务器,当停止时,你就知道用户已经离开或关闭了网页。

在你的情况下?如果您每 3 秒触摸一次服务器,则会话超时将被重新设置并从 1 分钟重新开始。您也没有提及您是使用内存还是使用 sql server 进行会话状态。

如果要跳回登录页面?然后您的 3 秒 js 代码必须每 3 秒获取/获取您调用的最后一次心跳的时间。因此,该例程必须设置一个开始时间,然后每 3 秒检查一次经过的时间。请记住,如果您使用 sql 会话,那么甚至不会触发登录事件,甚至不会触发经过身份验证的用户事件。因此,第一次开始运行该例程时,您需要使用开始时间设置会话值。

但是,据我所知,每个 Web 服务调用都会将会话超时重新设置为 0。当没有活动发生时,会话超时会重新设置。因此,如果用户正在做某事(或者您的 ajax 调用是),那么会话超时将永远不会发生。

您必须设置开始时间。然后从中获取经过的时间。只要您有网页点击并与服务器交谈,您的会话就永远不会超时。

于 2020-10-14T20:22:43.503 回答