[ASP.NET]相同的IIS,讓多個網站共用Session資訊
前言
先談談為什麼會有此需求吧,擔任甲方的IT部門最大的挑戰就是要維護舊的系統,要瞭解很多的business logic,而因為舊系統技術過舊架構也不太好,造成維護困難,故提出了重構的建議,但現實往往不可能那麼美好,因為還是要面對新的需求,處理使用者的操作問題,又因人力不足沒辦法專注的在重構這件事,所以只能列出計畫,有計劃性的慢慢重構,而短期目標就是舊的系統不要在增肥,而新的需求遵循新的架構走。
本公司舊系統是WebForm 2.0的Website,我試著導入MVC,故最初的想法是將舊網站先升級到FrameWork 4.0,再將新的MVC Application加入進去,但升級上遇到了困難,因舊的WebSite有買第三方Grid套件,故他是綁死在.NET 2.0的,嘗試升級後整個就悲劇了,故開始朝向兩個Website去處理,而遇到的課題就是一些Session資料如何共用:
1.將使用者的資訊存入Cookie - 可行,但有安全性的疑慮
2.利用SQL Server的Session機制實現
本篇將介紹第二點的實現方式
Step 1 建置並發佈兩個網站
而在這網站新增一個WebForm,程式也簡單到不行,秀出當前的Session及新增Session功能
Step 2 建置存放Session專用的資料庫
進入C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 將此路徑複製
進入命令提示字元,鍵入以下指令
aspnet_regsql.exe -S 資料庫主機IP -U sa -P 密碼 -ssadd -sstype c -d 資料庫名稱
請依情況去改變上方參數
利用SSMS,就可看到資料庫已經建置完成
Step 3 修改WebSite的Web.config
在Web.config system.web區塊加入以下程式,程式區塊都不用動
<sessionState mode="SQLServer" sqlConnectionString="data source=KYLE;initial catalog=SessionPool;user id=sa;password=kyle" allowCustomSqlDatabase="true" timeout="120"/>
Step 4 修改SQL Session Table
進入DB,會看到有以下兩個表:
ASPStateTempApplications 用來儲存應用程式的ID和名稱
ASPStateTempSessions 用來儲存Session的值
先兩分別Run看看在兩個網站寫入一個Session資料會變什麼情況
會發現會有兩筆AppName,而ASPStateTempSessions 則會有Session紀錄
接著最重要的,其實就是在SQL stored procedure做些手腳,讓不同的Apps,指向同一個AppName
打開預存程序dbo.TempGetAppID
修改@appName
這樣就大功告成了,我們重啟IIS和SQL,把Session清掉再來各新增一筆看看:
後記
建議,要重構還是整個重新規劃會比較好,畢竟Session移到SQL上,DB因為connection次數變多而負擔加重,多少會有些效能問題,但不能忍受古人的技術債又因為一些因素影響的人,就可以參考這種方式 T___T
--
Reference
http://www.cnblogs.com/haoxue/archive/2010/10/11/asp_net_session_share.html