把Session存放到SQL資料庫中,然後讓很多站台應用程式間比起互通.
這是一個常見聽到的話題,從網路搜尋的結果有很多個解答,
如下
[ASP.NET]相同的IIS,讓多個網站共用Session資訊
http://kyleap.blogspot.tw/2013/12/aspnetiissession.html
如何設定與啟用 ASP.NET 的 SQLServer 工作階段狀態模式
http://blog.miniasp.com/post/2011/09/14/Configure-SQL-Server-Session-State-Modes-for-ASPNET.aspx
如何讓 IIS6 / IIS7 中同站台不同應用程式間共用 Session 資料
http://blog.miniasp.com/post/2010/01/24/How-to-Share-Session-Across-Applications-in-a-Site.aspx
我自己實作的操作也寫下來.以便對照,
首先一定要利用.NET的工具替我們產稱SQL Server 資料庫存放Session的地方
到資料庫主機 .利用命令提示字元cmd,先切換到 .NET Framework的工作目錄底下,
當下我是先到這個目錄
C:\Windows\Microsoft.NET\Framework\v4.0.30319
執行
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -S . -E -ssadd -sstype c -d SessionStateDB
(輸入aspnet_regsql /? 會出現這命令的說明)
我剛剛用的是使用Windows驗證連線,更詳細的指令參考資訊請參考本文開頭的參考網站,
SessionStateDB就是要存放Session的資料庫
執行後好之後使用資料庫料庫連線工具連線到資料庫會看到新增了SessionStateDB資料庫
特意標註那個TempGetAppID的預存程序就是我們要來動手腳的地方,
我們先要確保不同Web應用程式的Name是一致的,所以我們就在這邊寫死,
當然有更活的方法,一樣參考本文列表的參考網站.更詳細的做法那邊有.
所以修改SP預存程序的一個段落變成下面這樣
SET @appName = LOWER('ShareSession') --把所有的APPName都設定成一樣
這樣在各個不同的web 應用程式的web.config裡面
只要加上一行
<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="DataSource=192.168.0.117;Database=SessionStateDB;User ID=XXXX;password=XXXXX" sqlCommandTimeout="60" cookieless="false" cookieName="ASP.NET_SessionId" timeout="60" />
如此程式在存取Session時通通都到這資料庫裡撈資料了,
接下來我們要到IIS裡去產生一組MachineCode
選中一台,產生一組金鑰所有應用程式共用,
將取得值寫到webconfig裡面,
<system.web>
<machineKey validationKey="xxx" decryptionKey="xxxx" validation="SHA1" decryption="AES"/>
</system.web>
這邊有個要小注意就是
各個站台的webconfig檔裡面 http cookie domain也都要設定成一樣!!
<httpCookies domain=".ourdomain.com.tw" />
結束!
參考資料還有:
Sharing ASP.NET Session State Across Applications
sharing session state between 2 ASP.NET applications using SQL Server ( Different Cookie Domain)