如何防止AJAX轮询使Asp.Net会话保持活动状态

Gre*_*reg 14 cookies ajax asp.net-mvc session

我们有一个ASP.Net应用程序,该会话(和cookie)的滑动期限为20分钟.但是,我们有一些AJAX正在轮询服务器以获取新信息.当然,这种情况的缺点是会话将无限期地继续,因为轮询呼叫会保持活动,从而导致到期时间被刷新.有没有办法防止这种情况 - 即只允许在非ajax调用上刷新会话?

关闭滑动到期并不是一个真正的选择,因为这是一个应用程序,业务用户将在电话呼叫之间的大部分时间使用.

关于这个的其他Stackoverflow讨论讨论了如何维护2个单独的应用程序(一个用于经过身份验证的调用,一个用于未经身份验证的调用.我不确定这是一个选项,因为所有调用都需要进行身份验证.

有任何想法吗?

Pat*_*ick -1

我通过在 i-Frame 中创建隐藏页面来完成此操作。然后使用 JavaScript 每 18 分钟发回一次以保持会话处于活动状态。这确实有效。

此示例来自 ASP.NET Forms 项目,但可以针对 MVC 进行调整。

  1. 创建一个名为KeepSessionAlive页面并添加元刷新标签

    元 id="MetaRefresh" http-equiv="刷新" content="21600;url=KeepSessionAlive.aspx"

  2. 在后面的代码中

    受保护的字符串WindowStatusText =“”;
    protected void Page_Load(object sender, EventArgs e)
    {
        //string RefreshValue = Convert.ToString((Session.Timeout * 60) - 60);
    
        string RefreshValue = Convert.ToString((Session.Timeout * 60) - 90);
    
        // Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter.
        MetaRefresh.Attributes["content"] = RefreshValue + ";url=KeepSessionAlive.aspx?q=" + DateTime.Now.Ticks;
    
        WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在母版页中添加隐藏的 iFrame

    iframe ID =“KeepAliveFrame”src =“KeepSessionAlive.aspx”frameBorder =“0”宽度=“0”高度=“0”

下载示例