我在C#中有一个网络应用程序,20分钟后会话超时。我无法改变这一点,因为其他应用程序使用相同的配置。
所以我正在检查Session是否为NULL以及是否为NULL。它重定向并添加一个带有会话ID的QueryString。我遇到的问题是Session会因为NULL而超出SessionID。无论如何在超时后仍然得到sessionid吗?
谢谢!
答案 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&将其设置回会话变量。