将会话超时设置为大于 1 小时将导致内存中保留过多的内存,IIS 会在会话期间保留所有会话内存。想象在高流量站点上的超时值为 5 小时,保持会话数以千计的用户会话的数据。
为了解决这个问题,我们需要在应用程序中自动刷新网页以创建回发。这可以通过元刷新标签来完成。
首先将以下标记添加到您的母版页:
<IFRAME ID="KeepAliveFrame" src="KeepSessionAlive.aspx" frameBorder="0" width="0" height="0" runat="server"></IFRAME>
接下来,创建一个名为 KeepSessionAlive.aspx 的新页面。在页面的 head 部分,添加以下行:
<meta id="MetaRefresh" http-equiv="refresh" content="21600;url=KeepSessionAlive.aspx" runat="server" />
<script language="javascript">
window.status = "<%=WindowStatusText%>";
</script>
这一行的关键是内容值。默认情况下,我们将该值设置为 21600 秒,即 6 小时。但是,我们将在此页面的 Web 应用程序的 Page_Load 中自行设置该值,因此可以忽略此默认值。
在 KeepSessionAlive.aspx.cs 的 Page_Load 中添加如下代码:
protected string WindowStatusText = "";
protected void Page_Load(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
// Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter.
MetaRefresh.Attributes["content"] = Convert.ToString((Session.Timeout * 60) - 60) + ";url=KeepSessionAlive.aspx?q=" + DateTime.Now.Ticks;
WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
}
}
最后一个重要步骤是将 web.config 会话超时值更改为小于 IIS 可能的超时值的值。如果您的值大于 IIS,您的自动刷新将永远不会发生,因为 IIS 在刷新计时器激活之前已经重置了您的会话状态。选择 10 分钟之类的值似乎效果很好。请记住,即使会话超时值为 10 分钟,您的自动刷新方法与滑动到期相结合,也会使会话保持活动状态。