我正在設置SQL Server會話狀態的一個非常基本的演示,但在使其工作時遇到了一些麻煩。我試圖用IIS 7.5和SQL Server 2008 R2在本地運行Windows 7進行測試。在Web應用程序間共享SQL Server會話狀態
最終,我需要一種方法來跟蹤登錄到在幾個不同的Web服務器之間進行負載平衡的系統的用戶數量。所以我需要每次用戶登錄或註銷時更新會話變量(存儲在SQL中)。所以會話ID總是可以不同。這可能嗎?
這是我到目前爲止已經完成:
- 創建了兩個新的IIS(1和Site2)網站
- 創建兩個新的Web應用程序項目在VS 2010中(1和Site2)
- 在這兩個站點的Default.aspx頁面上,我創建了一個按鈕,單擊它時會將「Site1」或「Site2」(取決於站點)保存到名爲「LastSiteUsed」的會話變量中。還有另一個按鈕,單擊它時,將讀取「LastSiteUsed」會話變量的值並將其顯示在標籤中。
- 在SQL中,我創建了一個名爲dbSessionTest的新數據庫。然後我按照MSDN to install the Session State Database using the aspnet_regsql tool上的說明操作。
- 在我的兩個Web應用程序的Web.config文件中,我已經添加了以下下
<System.Web>
:
<sessionState mode="SQLServer" sqlConnectionString="server=.\sqlexpress;database=dbSessionTest;uid=myUsername;pwd=myPassword" cookieless="false" timeout="20" allowCustomSqlDatabase="true"/>
這兩個網站的功能正常,但他們似乎並不爲分享會議。例如,當我點擊我的按鈕以從Site1保存會話變量時,我希望能夠從Site2中讀取該值,但它不起作用。 Site2將只返回「Site2」,而Site1將只返回「Site1」。
有沒有人有任何想法,我可能做錯了什麼?我錯在認爲我應該能夠從Site2讀取由Site1設置的值嗎?
UPDATE:
我可以看到會話數據獲得存儲在SQL Management Studio中ASPStateTempSessions
表,但每個站點仍然只能看到它寫的值。每個站點都設置會話變量是這樣的:
Session("LastSiteUsed") = "Site2"
這兩個網站的檢索像值:
lblValue.Text = "Value from Session: " & Session("LastSiteUsed").ToString
我需要訪問存儲在SQL Server會話變量不同的做到這一點?
更新2:
我使用默認的數據庫,ASPState的,這是運行此命令創建的嘗試:
aspnet_regsql.exe -S MyServerName -E -ssadd -sstype p
然後簡化我的每一個網頁的。配置文件,如:
<sessionState mode="SQLServer" sqlConnectionString="Data Source=.\sqlexpress;User ID=myUsername;Password=myPassword" cookieless="false" timeout="20"/>
但同樣,沒有運氣。我希望能夠從Site1中設置會話變量,然後從Site2中讀取值,但它不起作用。再次,我可以看到ASPStateTempSessions
表中顯示的條目,所以我知道它們輸入正確。我注意到的一件事是他們有不同的會話ID?
有什麼我需要做不同的事情來確保在設置/讀取同一個會話變量時在我的站點之間使用相同的會話ID?
UPDATE 3:
我已經從this article其中修改一個SP和用於分組到ASPStateTempApplications
表添加一個柱,然後進行操作。這種工作,但前提是兩個我的網站都在同一瀏覽器中打開(使用標籤)。我需要能夠在IE中打開Site1,將值保存到我的會話變量中,關閉瀏覽器,在Chrome中打開Site2並讀取值。從我用SQL Server會話狀態讀取的所有內容...這應該是可能的。
UPDATE 4 - 解決方案:
我接着@SilverNinja提供this article答案。我通過命令提示符重新創建了ASPState
數據庫(以在更新#3中撤銷我的SP更改),然後根據鏈接的答案修改TempGetAppID
SP。我也更新我的兩個Web.config文件中,從那篇文章以及答案一致:
<sessionState mode="SQLServer"
sqlConnectionString="Data Source=.\sqlexpress;User ID=myUsername;Password=myPassword;Application Name=CacheTest"/>
我也同時包括在Web.config文件中相同的計算機密鑰:
<machineKey validationKey="59C42C5AB0988049AB0555E3F2128061AE9B75E3A522F25B34A21A46B51F188A5C0C1C74F918DFB44C33406B6E874A54167DFA06AC3BE1C3FEE8506E710015DB" decryptionKey="3C98C7E33D6BC8A8C4B7D966F42F2818D33AAB84A81C594AF8F4A533ADB23B97" validation="SHA1" decryption="AES" />
現在我可以(使用IE)打開我的兩個站點,從站點1設置一個值,並從站點2讀取它(反之亦然)。當我檢查表時,只有一個SessionID存在(兩個站點正確使用相同的會話)。在開啓新瀏覽器(例如Chrome)之前,我的想法是錯誤的,會使用相同的會話 - 新瀏覽器將啓動它自己的會話。在負載平衡的情況下,這不應該導致任何問題。
'Application Name = CacheTest'對於所有Web應用程序(WebSites)都是一樣的嗎?或**不同的值**? – Kiquenet