前文讲道有关页面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端在内存使用上的压力。这两者你需要自己找到一个平衡。