首页 文章

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

提问于
浏览
1

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

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

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

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

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

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

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

3 回答

  • 1

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

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

  • 2

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

    window.open() clears session

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

  • 0

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


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

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

    可能会发生两件事

    • Both sites run under the same Application Pool :两个站点的会话应该相同 .

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

    • Sites run under different Application Pools in IIS :甚至没有梦想你可以为两个窗口共享同一个会话

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

相关问题