空闲时间总是应该大于会话超时?

时间:2015-02-20 11:05:38

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

我在asp.net c#中有一个项目。我没有使用表单身份验证。我有简单的登录页面。当用户成功登录用户重定向到仪表板并且会话[“用户”]也生成了。但问题是当用户不要使用网站20分钟或超过20分钟,当用户回来时尝试使用it.session已过期。用户重定向到再次登录页面。 我也在web.config文件中使用以下脚本

<sessionState timeout = "500" mode = "InProc" />

这是因为空闲时间是否因为我的空闲时间是20分钟。 IS空闲时间总是应该大于会话超时吗?我希望会话活动8到9小时或最大或用户不按下注销按钮

2 个答案:

答案 0 :(得分:1)

无法从配置中更改默认值20。但您可以从IIS更改此时间。

在IIS中检查它。 打开IIS,单击“应用程序池”,为应用程序选择“应用程序池”。

  

右键单击 - &gt;选择属性

  

效果标签

将空闲超时设置为“闲置.....分钟后关闭工作进程”所需的分钟数。

  

之后重启IIS。

答案 1 :(得分:0)

将会话时间设置为大于1小时的任何时间将导致内存中保留过多内存,IIS会话期间保留所有会话内存。在高流量站点上设置超时值5小时,为数千名用户提供会话数据&#39;会话。

要解决此问题,我们需要自动刷新应用程序中的网页以创建回发。这可以使用元刷新标记来完成。

首先将以下标记添加到母版页:

<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中设置值,因此可以忽略此默认值。

将以下代码添加到Keep_SessionAlive.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分钟,您的自动刷新方法与滑动到期相结合,也会使会话保持活动状态。