2013年12月7日 星期六

[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 建置並發佈兩個網站

image

而在這網站新增一個WebForm,程式也簡單到不行,秀出當前的Session及新增Session功能

image

Step 2 建置存放Session專用的資料庫

進入C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 將此路徑複製

image

進入命令提示字元,鍵入以下指令

aspnet_regsql.exe -S 資料庫主機IP -U sa -P 密碼 -ssadd -sstype c -d 資料庫名稱

請依情況去改變上方參數

image

利用SSMS,就可看到資料庫已經建置完成

image

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的值

image

先兩分別Run看看在兩個網站寫入一個Session資料會變什麼情況

image

會發現會有兩筆AppName,而ASPStateTempSessions 則會有Session紀錄

接著最重要的,其實就是在SQL stored procedure做些手腳,讓不同的Apps,指向同一個AppName

打開預存程序dbo.TempGetAppID

image

修改@appName

image

這樣就大功告成了,我們重啟IIS和SQL,把Session清掉再來各新增一筆看看:

image

後記

建議,要重構還是整個重新規劃會比較好,畢竟Session移到SQL上,DB因為connection次數變多而負擔加重,多少會有些效能問題,但不能忍受古人的技術債又因為一些因素影響的人,就可以參考這種方式 T___T

--

Reference

http://www.cnblogs.com/haoxue/archive/2010/10/11/asp_net_session_share.html

http://www.debugease.com/aspdotnet/1712975.html

沒有留言:

張貼留言