【问题标题】:ASP.NET SessionState TimeOut not workingASP.NET SessionState TimeOut 不起作用
【发布时间】:2011-12-27 23:58:19
【问题描述】:

我希望在 SessionState 超时发生时关闭我的网页。这是我的网络配置中的代码:

<system.web>
<sessionState timeout="1" mode="InProc"/>
</system.web>

出于测试目的,我设置为 1 分钟。以下是我的 Global.asax 代码:

protected void Session_End(object sender, EventArgs e)
{
    Response.Redirect("~/LogOut.aspx");
}

为了检查会话超时,我在其中一个页面上放了一个标签,这是 Page_Load 事件中的代码:

lblSession.Text = "SESSION TIME: " + Session.Timeout.ToString();

当我进入站点并来到此页面时,标签显示 SESSION TIME: 1,但 1 分钟后我没有被重定向到 LogOut 页面,当前页面仍处于完全活动状态且正常工作,显然意味着会话尚未终止。 我正在通过开发服务器在 Visual Studio 2008 中工作,因此我看到的与 IIS 设置相关的建议在此阶段似乎并不相关。 请帮忙!

【问题讨论】:

    标签: c# asp.net session-state session-timeout


    【解决方案1】:

    HTTP 是一种请求/响应协议。浏览器和服务器之间没有持久连接。因此,Session_End 中的代码实际上什么都不做——它不能告诉浏览器做任何事情。

    您需要创建一个(客户端)JavaScript 计时器并在会话超时结束之前actively 加载注销页面。

    【讨论】:

    • 代码甚至可能崩溃,因为此时响应为空。
    • 可以帮我制作一个 javaScript 计时器吗?谢谢。
    • 我使用了 AJAX 计时器。在 page_Load 中,我将会话超时值放在一个 int 变量中乘以 60000 以获得以毫秒为单位的超时,然后我将计时器的间隔属性设置为超时减去 2000 毫秒,以便计时器在会话超时过去之前触发一点.这会触发我重定向到 LogOut 页面的 Timer_Tick 事件。它工作得很好。谢谢!
    【解决方案2】:

    Session_End 以我的经验在超时发生后的第一次回发(可以通过客户端计时器实现)上被调用 - 只要可能......如果用户只是关闭浏览器,这个事件可能永远不会调用(除非您创建了一个特定的 JS 处理程序 unload 在这种情况下执行回发)。

    有关一些信息,请参阅:

    【讨论】:

    【解决方案3】:

    这似乎不是测试会话超时的正确方法。尝试在会话变量中放入一些东西。再过几分钟不要触摸该页面,然后尝试从 Session 中读取它。如果你的会话是活动的,你应该能够看到变量,否则......你不会。

    了解有关会话和故障排除会话的更多信息...http://aspalliance.com/1182_Troubleshooting_Session_Related_Issues_in_ASPNET

    【讨论】:

    • 谢谢,我看到你的链接处理会话丢失,但我的问题似乎是相反的,会话没有按预期结束,页面继续像往常一样反应,按钮像往常一样做出反应并导致回发等。
    • @DovMiller,Ondrej 说得恰如其分。简单来说,Session_End 根本不会在“浏览器”中触发。这是一个在会话结束时在服务器上发生的事件。由于在此期间客户端可能会或可能不会连接,因此您无法在此事件中执行 Response.Redirect AFAIK。因此,您不会看到浏览器自动做出反应。您是否有机会尝试我之前建议的会话变量方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2018-12-24
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多