几个window.open调用我的ASP.NET会话超时

时间:2009-09-22 19:41:18

标签: asp.net session cookies internet-explorer-8 timeout

我有一个使用StateServer会话模式的ASP.NET应用程序,其中cookieless设置为false。在一些地方,有一个链接会弹出一个窗口到另一个应用程序(它恰好位于同一个域,但位于不同的虚拟目录中)。以下步骤让我感到悲伤......

  1. 启动弹出窗口
  2. 关闭弹出窗口
  3. 使用几个不同的参数将弹出窗口启动到与以前相同的应用程序
  4. 关闭弹出窗口
  5. 下一个请求=“父”窗口上的会话超时。
  6. 使用无Cookie会话解决了这个问题,所以我的cookie在某种程度上被浏览器搞砸了。除了使用无cookie会话,如何解决这个问题?对于它的价值,我正在开发/测试IE8。

    修改

    似乎问题只发生在弹出窗口位于同一个域上时。如果我在其他地方弹出一个页面,则没有问题。

3 个答案:

答案 0 :(得分:1)

是否可能其他应用(在同一个域上)设置自己的Cookie,覆盖主应用的cookie?您可以使用fiddler(或类似工具)查看哪些应用程序设置了哪些Cookie?

答案 1 :(得分:0)

检查

的所有实例
Session.Clear();
Session.Abandon();

如果您根本不使用这些,那么您的浏览器窗口可能会设置为不共享会话。因此,新实例获得一个新的会话cookie(因为它与前一个cookie的名称相同,它可能会杀死现有的会话cookie) - 如同播放: http://geekswithblogs.net/ranganh/archive/2009/04/17/asp.net-session-state-shared-between-ie-tabs-and-ie8.aspx

理想情况下,追踪Set-Cookie标头所在的页面。然后查看请求进入该响应并查看当前的ASP.NET_SESSIONID cookie是否已发送。 (提琴手确实是最好的工具) 无论如何 - 它是一个尝试的开始。

答案 2 :(得分:-1)

编辑显然这不是你的cookie名称,所以...... 也许你应该在你的主页面上进行一次AJAX调用,在你的web应用程序上ping一个服务(或通用处理程序),以使会话保持活动状态。

JavaScript

window.setInterval(function() { 
    $.get('ping.ashx?nocache=' + (new Date()).getTime(), function() { 
        return true; 
    })
}, 30000);

在Generic Handler中,确保添加IRequiresSessionState标记接口。

也许你的会话cookie名称是相同的。

在您的web.config中(对于其中一个应用程序)更改会话cookie名称。

<sessionState
mode="StateServer"
timeout="20"
cookieName="DifferentASP.NET_SessionId"