页面ViewState体积庞大影响性能解决方案

29 篇文章 0 订阅

我们都知道asp.net 服务器控件状态都是通过ViewState对象存储的,实际上是存储在客户端页面上的隐藏域中,当数据量过大时频繁和服务器传输,严重影响性能。直接想到的办法就是把这些数据储存到别的介子中。  这里介绍两中存储方法,存储到数据库和物理文件中。

首先,我们要找到ViewState存储和恢复的入口函数。

Page类中LoadPageStateFromPersistenceMedium()为恢复数据函数, SavePageStateToPersistenceMedium(object state)为存储数据函数,我们只需重写这两个方法即可满足自定义处理ViewState的需求


1、存储到数据库

//存视图数据

protected override void SavePageStateToPersistenceMedium(object state)
    { 

        string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生唯一的Id编码,防止多用户访问时造成数据误读
        string str = (new ObjectStateFormatter()).Serialize(state);//将对象序列化为Base64格式字符串
        //将ViewStateID和序列化后数据写数据库

       base.SavePageStateToPersistenceMedium(viewStateID); //将唯一Id存储到ViewState中,以便Load时一一对应读取相应数据
    }

//恢复视图数据

protected override object LoadPageStateFromPersistenceMedium()
    {

        string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second; //读取唯一Id,注意:此处为Second,为ViewState对象,First为ControlState,可通过.net反编译工具看出。
         string str=//根据viewStateID从数据库读取序列化后的数据
         return (new ObjectStateFormatter()).Deserialize(str);//将Base64格式字符串反序列化为对象
    }


2、存储到文件

//存视图数据

protected override void SavePageStateToPersistenceMedium(object state)
    {
        string str = (new ObjectStateFormatter()).Serialize(state);
        int length = str.Length;
        string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString();
        string filePath = MapPath("SaveViewStateFile/File(" + viewStateID + ").txt");
        File.WriteAllText(filePath, str);

        base.SavePageStateToPersistenceMedium(viewStateID);
    }

//恢复视图数据

protected override object LoadPageStateFromPersistenceMedium()
    {
         string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;

         string filePath = MapPath("SaveViewStateFile/File("+viewStateID+").txt");
         string str= File.ReadAllText(filePath);
         return (new ObjectStateFormatter()).Deserialize(str);
    }


总结:


将ViewState数据转移其实很简单,只要找到两个入口函数即可,但注意多个会话同时操作时务必保证每个会话和视图数据一一对应,否则会造成数据混乱。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值