化恶魔为天使,巧移ViewState至SqlServer
(发文后记:还是说清楚前提吧,本文只适用于当不得已才使用ViewState的情况)
ViewState一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传(PostBack)数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。
最近项目中用到了Telerik的RadGrid,使用服务器端绑定数据后页面ViewState体积过大,而导致性能严重降低,便开始找寻优化方式,尽量将ViewState存在服务器端。
由于项目已开发至中期,不可能做类似于取消ViewState或使用客户端绑定之类的大规模改动。
要想改动量最小化,肯定不能影响原有ViewState的使用,那只能重写Page类的LoadPageStateFromPersistenceMedium()和SavePageStateToPersistenceMedium(object state)的方法,在这两个Override的方法中把数据存在别的什么地方。
这时候就来问题了,ViewState只是一个页面的周期,每打开一个页面都会生成一个新的ViewState,连刷新都不例外,如果存在文件或数据库中,这些数据累积起来可不是开玩笑的,而且也用不上了,那还不得要写过期删除的方法么?太麻烦了。这时候,Session就发挥大作用了,Session的生命周期长于ViewState,过期会自动删除,而且还是存在服务器端的,不会增加数据传输量,看来很合适。
代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
但是不能忽略一个问题,Session默认是由WebServer 管理的,一般只用于存储会话中用户登录信息这种数据量极小的情况,如果直接把ViewState这个大胖子塞进去,全部是保存在内存中的,无疑用不了多长时间,WebServer就会因为Session数据量过大而崩溃。看来我们还需要转移Session。
正好,ASP.NET支持自定义会话管理的方式:
开始-> All Programs-> Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 Command Prompt
进入VS命令行模式。
执行 aspnet_regsql –S (192.168.19.250) –U sa –P 123 –ssadd
这是指使用用户名sa 密码123登录到SQLServer服务器192.168.19.250上添加状态管理相关的数据库。其实它是建立了一个只有出口存储过程的数据库ASPState,并在系统数据库tempdb中加入了两张分别用于存储Application 和Session的表。
这时候我们就完成了状态管理相关的数据库的创建,然后只要在 Web.config中做如下设置即可
<sessionState mode="SQLServer" sqlConnectionString="Data Source=192.168.19.250;User ID=sa;Password=123;"></sessionState>
</system.web>
这时候,该Web应用的Session数据就会存储于数据库中。
在使用的时候,只要将原有的页面都从AmoPage类继承就行。
至于效果,试过就知道!
使用前:(很熟悉吧...)
使用后:(干净,清透,没问题!)
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击