您好,欢迎访问一九零五行业门户网

化恶魔为天使,巧移ViewState至SqlServer

(发文后记:还是说清楚前提吧,本文只适用于当不得已才使用viewstate的情况) viewstate 一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传( postback )数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。 最近
(发文后记:还是说清楚前提吧,本文只适用于当不得已才使用viewstate的情况)
viewstate一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传(postback)数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。
最近项目中用到了telerik的radgrid,使用服务器端绑定数据后页面viewstate体积过大,而导致性能严重降低,便开始找寻优化方式,尽量将viewstate存在服务器端。
由于项目已开发至中期,不可能做类似于取消viewstate或使用客户端绑定之类的大规模改动。
要想改动量最小化,肯定不能影响原有viewstate的使用,那只能重写page类的loadpagestatefrompersistencemedium()和savepagestatetopersistencemedium(object state)的方法,在这两个override的方法中把数据存在别的什么地方。
这时候就来问题了,viewstate只是一个页面的周期,每打开一个页面都会生成一个新的viewstate,连刷新都不例外,如果存在文件或数据库中,这些数据累积起来可不是开玩笑的,而且也用不上了,那还不得要写过期删除的方法么?太麻烦了。这时候,session就发挥大作用了,session的生命周期长于viewstate,过期会自动删除,而且还是存在服务器端的,不会增加数据传输量,看来很合适。
代码如下:
code
public class amopage: system.web.ui.page
{
    #region === move view state to session ===
private string _pageguid = null;
    public string pageguid
    {
        get
        {
            if (_pageguid == null)
                _pageguid = this.request.form[__amoviewstate];
            if (_pageguid == null)
                _pageguid = guid.newguid().tostring();
            return _pageguid;
        }
        set { _pageguid = value; }
    }
protected override object loadpagestatefrompersistencemedium()
    {
        return session[this.pageguid];
    }
protected override void savepagestatetopersistencemedium(object state)
    {
        registerhiddenfield(__amoviewstate, this.pageguid);
        session[this.pageguid] = state;
    }
#endregion
}
但是不能忽略一个问题,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中做如下设置即可
system.web>
    sessionstate mode=sqlserver sqlconnectionstring=data source=192.168.19.250;user id=sa;password=123;>sessionstate>
system.web>
这时候,该web应用的session数据就会存储于数据库中。
在使用的时候,只要将原有的页面都从amopage类继承就行。
至于效果,试过就知道!
使用前:(很熟悉吧...)
使用后:(干净,清透,没问题!)
其它类似信息

推荐信息