特别的ViewState存储方式(降低客户端的压力)

    前文讲道有关页面ViewState的存储方式 ,简单讲ViewState的存储是基于客户端的HiddenField实现的。


    但最近在自己的项目中碰到一个把过多的东西放到ViewState中页面加载速度很慢的问题,原因也很简单。Server部署在新加坡,client和Server之间的网络速度比较慢,加上大量的ViewState内容导致页面大增。甚至server端会抛出一个HttpException, 说client端的名字无效。我个人认为是因为在client和server通信之间,由于丢包而导致的数据不完整。因为ViewState内容所在的HiddenField每次也会从client端被Post到server端,所以ViewState内容过大是导致问题的关键。


    好了,既然知道了原因,我们就能找到相关的解决办法。

    首先,想到的是减少放入ViewState中的数据,但是不放在ViewState中又能放在哪呢,Session吧,但是这样要修改大量的代码,而且所有server端的控件自己的ViewState还是会保存在HiddenField中。

    那么,我们又发现了Page有个对象叫PageStatePersister,该对象决定了我们如何保存页面的ViewState状态。哈哈,.net 2.0提供了两个已经实现的PageStatePersister, HiddenFieldPageState和SessionPageStatePersister。HiddenFieldPageState就是我们常用的ViewState保存方式。那么SessionPageStatePersister就是可以把ViewState保存在Session中的持久化方式。

    我们只需要override Page的PageStatePersister就可以修改这个ViewState持久化方式了。

 

    protected override PageStatePersister PageStatePersister {
get {
return new SessionPageStatePersister(this);
}
}

 

    通过这个方法,我们不需要大量代码的修改,把对client端网络的压力转移到了server端,这里你还是需要注意的,这样的持久化方式使得client和server之间的通信压力减小了,但是却增加了server端在内存使用上的压力。这两者你需要自己找到一个平衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值