前言
先谈谈为什么会有此需求吧,担任甲方的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__ |