会话超时添加到QueryString

时间:2011-12-01 21:32:09

标签: c# asp.net

我在C#中有一个网络应用程序,20分钟后会话超时。我无法改变这一点,因为其他应用程序使用相同的配置。

所以我正在检查Session是否为NULL以及是否为NULL。它重定向并添加一个带有会话ID的QueryString。我遇到的问题是Session会因为NULL而超出SessionID。无论如何在超时后仍然得到sessionid吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

不,一旦会议结束,它就会消失。

但是,如果您可以控制网页,则可以通过在实现IRequiresSessionState的ashx页面中回调简单的ping方法,在javascript中创建保持活动机制。将暂时更新一个例子。

这是我们使用的javascript(请注意,这会警告用户超时,但它可以轻松执行非发布查询):

var m_TimeoutWarningID = null;
function ResetSessionTimeoutWarning() {
    try {
        // Clear the previous timeout warning, if any
        if (m_TimeoutWarningID != null) {
            window.clearTimeout(m_TimeoutWarningID);
        }
        // If the caller has set the session expiration minutes, and it is not 0, initialize the timer
        if ((typeof m_wSessionTimeoutWarningMinutes !== 'undefined') && (m_wSessionTimeoutWarningMinutes != 0)) {
            // Pass the expiration minutes to the called method in case something happens to the var between 
            // now and the time the method is executed.
            m_TimeoutWarningID = window.setTimeout("SessionTimeoutWarning(" + m_wSessionTimeoutWarningMinutes + ")", m_wSessionExpiresInMinutes * 60000);
        }
    } catch (ex) {
        alert('Javascript Error (ResetSessionTimeoutWarning)\r' + ex.message);
    }
}

function SessionTimeoutWarning(wSessionTimeoutWarningMinutes) {
    if (window) {
        window.focus();
    }
    // Don't worry about exceptions here
    if (window) {
        window.focus();
    }
    if (confirm("Your login session will expire in " + wSessionTimeoutWarningMinutes + " minutes. Please press Ok within this time period to confirm you are still working.")) {
        // Send a request back to the server to renew the session timeout
        ResetSessionTimeout();

        // Reset the session timeout warning now
        ResetSessionTimeoutWarning();
    }
}

在上面的示例中,m_wSessionTimeoutWarningMinutes和m_wSessionExpiresInMinutes在服务器端代码中设置,同时初始调用ResetSessionTimeoutWarning()。

ResestSessionTimeout针对实现IRequiresSessionState的ASHX页面执行ajax请求,以保持用户的会话处于活动状态。

答案 1 :(得分:1)

强大的应用程序不关心会话到期。这可能在会话超时到期之前发生,例如,如果应用程序池被回收。

因此,强大的应用程序将始终测试Session中是否存在数据项,如果不存在则刷新它(例如,从数据库中)。 E.g:

MyType GetMyValue()
{
    object o = Session["MyValue"];
    if (o == null)
    {
        o = GetMyValueFromPersistentStore(...); // ... e.g. from a database
        Session["MyValue"] = o;
    }
    return (MyType) o;
}

如果您使用Session来保存尚未保留的瞬态数据,那么您可能需要重定向到主页,并让用户重新开始。如果可能的话应该避免。

答案 2 :(得分:0)

在创建SessionID时,您还可以将其保存到浏览器cookie中。

然后,当您检查是否有SessionID时,请先检查您的会话。 如果它不存在,请检查cookie&将其设置回会话变量。