在最小SharePoint页面中的window.open之后,会话为null

时间:2011-04-04 19:10:18

标签: javascript asp.net sharepoint session httpcontext

我在会话变量中存储令牌。我使用javascript windows.open函数在新的ASPX页面中启动需要此令牌的报表。当这个新页面加载HttpContext.Current.Session为空时。

我通过在查询字符串中传递令牌来解决这个问题,但是此窗口中的活动需要保持父窗口的会话处于活动状态,并且我不确定会话对象为空的意味着什么。

通过使用javascript中的window.open知道为什么HttpContext.Current.Session对象为null?

编辑:我将添加这是存储在SharePoint库中的基本System.Web.UI.Page,并且从webpart调用window.open函数。 我认为这个页面可能需要从基类继承来共享正确的上下文。

更新:我已经缩小了与SharePoint相关的问题。我将访问Session对象的代码移动到Web部件中。如果放入标准Web部件页面,Web部件工作正常,但我将其添加到仅包含ScriptManager,SPWebPartManager和WebPartZone的最小页面。代码运行但会话对象再次为null。我的最小页面缺少使Session对象可用的东西。

已解决:实现IRequiresSessionState接口所需的最小ASPX页面。之后,Session对象就在那里。

因为他提供了最有用的信息,所以我会把这个信息告诉安德烈。

3 个答案:

答案 0 :(得分:2)

从技术上讲,它与网站的连接不同,这就是为什么它是一个不同的会话。如果您希望不同的窗口使用相同的会话存储,则最好使用应用程序缓存而不是会话。

更新: 如果你想坚持使用会话状态,你可以做的是将会话ID写入持久性cookie,这样子窗口对服务器的调用将随身携带,你可以从该cookie中检索SessionID。重要提示:确保在放入cookie之前加密会话ID以避免会话劫持。

答案 1 :(得分:1)

window.open()应保持相同的会话ID

window.open() clears session

确保您传递给open()方法的网址是相对或相同的域名

答案 2 :(得分:0)

我假设您使用的是IIS 6或更高版本。


假设您有2个不同的网站:

http://site1.yourdomain.com
http://site2.yourdomain.com

可能会发生两件事

  1. 两个网站都在同一个应用程序池下运行:两个网站的会话应该相同。

    注意:如果最新窗口不是来自当前打开的窗口,则为版本8之前的Internet Explorer分配不同的会话。从版本8开始,无论窗口的来源如何,访问同一应用程序池的所有窗口都共享相同的版本。

  2. 网站在IIS中的不同应用程序池下运行:甚至没有梦想你可以为两个窗口共享同一个会话

  3. 如果两个窗口的网站相同,那么两个窗口之间的共享会话应该没有任何问题,即使是任何版本的Internet Explorer,因为第二个窗口来自第一个窗口,通过调用window.open()方法