我在会话变量中存储令牌 . 我使用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 回答
从技术上讲,它与网站的连接不同,这就是为什么它是一个不同的会话 . 如果您希望不同的窗口使用相同的会话存储,则最好使用应用程序缓存而不是会话 .
更新:如果你想坚持使用会话状态,你可以做的是将会话ID写入持久cookie,这样子窗口对服务器的调用将携带它,你可以从该cookie检索SessionID . 重要提示:确保在放入cookie之前加密会话ID以避免会话劫持 .
window.open()
应该保持相同的会话IDwindow.open() clears session
确保传递给
open()
方法的URL是相对或相同的域名我假设您使用的是IIS 6或更高版本 .
假设您有2个不同的网站:
可能会发生两件事
note: 如果最新窗口不是来自当前打开的窗口,则为版本8之前的Internet Explorer分配不同的会话 . 从版本8开始,无论窗口的来源如何,访问同一应用程序池的所有窗口都共享相同的版本 .
如果两个窗口的网站相同,那么在两个窗口之间共享会话时应该没有任何问题,即使使用任何版本的Internet Explorer,因为第二个窗口是通过调用window.open()方法从第一个窗口发起的 .