2011-04-04 21 views
1

我將一個令牌存儲在會話變量中。我使用javascript windows.open函數在新的ASPX頁面中啓動需要此令牌的報表。當這個新的頁面加載HttpContext.Current.Session爲空。在最小的SharePoint頁面中的window.open之後的會話null

我已經通過在查詢字符串中傳遞令牌來解決此問題,但此窗口中的活動需要保持父窗口的會話處於活動狀態,我不確定會話對象爲空是否意味着此方案。

任何想法爲什麼HttpContext.Current.Session對象將通過使用window.open從JavaScript?

編輯:我會補充說這是存儲在SharePoint庫中的基本System.Web.UI.Page,並且從webpart調用window.open函數。 我在想這個頁面可能需要從基類繼承來共享正確的上下文。

更新:我已經縮小了這與SharePoint有關。我將訪問Session對象的代碼移到了Web部件中。如果放在標準Web部件頁面中,Web部件工作正常,但我已將其添加到僅包含ScriptManager,SPWebPartManager和WebPartZone的最小頁面。代碼運行,但會話對象再次爲空。我最小的頁面缺少使Session對象可用的東西。

已解決:我最小的ASPX頁面需要實現IRequiresSessionState接口。之後,Session對象就在那裏。

自從他提供了最有用的信息以來,我將給安德烈帶來信譽。

+0

我將此頁面從SharePoint庫移至_layouts目錄並從LayoutsPageBase繼承,但它沒有任何影響。 HttpContext.Current中的HttpSessionState對象爲null。 – webwires 2011-04-05 14:20:50

+0

正如我在我的回答中所提到的,會話cookie不是持久性的,因此它不會在不同的瀏覽器窗口之間共享。您必須將會話標識顯式傳遞到新窗口,無論是作爲您創建的持久性cookie還是作爲url的一部分。沒有其他辦法。 – Andrey 2011-04-05 15:06:04

+0

我們已經在使用持久性cookies。我們的SharePoint網站使用FBA,並且我們要求Office集成的Cookie持久性。我已經能夠驗證這是與SharePoint相關的。我將頁面轉換爲最小的Web部件頁面,並將Session訪問權限移至Web部件。如果Web部件放在標準的Sharepoint Web部件頁面中,它就可以工作。如果我在最小的情況下使用它,它會失敗。我在使會話可用的頁面中丟失了一些東西。 – webwires 2011-04-05 19:20:07

回答

2

從技術上講,這是與網站的不同連接,這就是爲什麼它是不同的會話。如果您希望不同的窗口使用相同的會話存儲,最好使用應用程序緩存而不是會話。

更新: 如果你想堅持使用會話狀態,你可以做什麼,就是將會話ID寫入一個持久cookie,這樣子窗口對服務器的調用就會攜帶它,你可以檢索SessionID從那個cookie。重要提示:請確保在將cookie放入cookie中之前加密會話ID以避免會話劫持。

+0

我最初想到了這一點,但它並不是說令牌密鑰是空的,而是整個會話對象爲空。此外,我並沒有被要求重新進行身份驗證,因此它似乎有某種用戶相同的上下文。 – webwires 2011-04-04 19:50:54

+1

會話ID存儲在非持久性cookie中,因此它不會在瀏覽器窗口之間共享,而不像身份驗證cookie(如果您使auth cookie持久存在) - 這說明您不必在新窗口中登錄,但可以「 t訪問父窗口的會話 - 來自子窗口的帖子不會將會話ID cookie發送回 – Andrey 2011-04-04 20:33:33

+1

http://msdn.microsoft.com/en-us/library/ms178194.aspx - 一直到「 Cookies和會話狀態「 – Andrey 2011-04-04 20:35:16

0

我假設你使用的是IIS 6或後來。


比方說你有2個不同的網站:

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

2件事情都可能發生

  1. 這兩個網站相同的應用程序池下運行:會話應該是相同的這兩個網站。

    note:如果最新的窗口不是從當前打開的窗口發起的,則版本8之前的Internet Explorer將被分配不同的會話。從版本8開始,訪問相同應用程序池的所有窗口共享相同的版本,無論窗口的來源如何。

  2. 網站在不同的應用程序池在IIS中運行:甚至不做夢,你可以對Windows

共享相同的會話如果網站是兩個窗口,你不應該有任何相同兩個窗口之間的問題共享會話,即使使用任何版本的Internet Explorer,因爲第二個窗口是通過調用window.open()方法從第一個窗口發起的。

+0

這兩個窗口的鏈接地址相同,並且它們位於同一個應用程序池中。這是一個SharePoint網站。網頁部分位於不同的網站集中,但具有相同的應用程序池。 – webwires 2011-04-05 14:22:34

相關問題