我有一个基本的常规ASP.NET Webforms应用程序。它部署在自己的具有大量RAM的AWS实例上,并且很少(如果有的话)拥有十几个并发用户。这些页面大多数都由大的gridview和formview组成,全部使用ViewState。每个页面大约1.5Mb,因此对于互联网速度较慢的用户而言,回发上载需要一段时间,这使应用程序难以使用。
我一直在寻找减少页面大小而不将整个内容重新构建为MVC的方法。我首先尝试像下面的CodeProject page所示压缩ViewState:
protected override object LoadPageStateFromPersistenceMedium()
{
string viewState = Request.Form["__VSTATE"];
byte[] bytes = System.Convert.FromBase64String(viewState);
bytes = Compressor.Decompress(bytes);
var formatter = new System.Web.UI.LosFormatter();
return formatter.Deserialize(System.Convert.ToBase64String(bytes));
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
var formatter = new System.Web.UI.LosFormatter();
StringWriter writer = new StringWriter();
formatter.Serialize(writer, viewState);
string viewStateString = writer.ToString();
byte[] bytes = System.Convert.FromBase64String(viewStateString);
bytes = Compressor.Compress(bytes);
ClientScript.RegisterHiddenField("__VSTATE",
System.Convert.ToBase64String(bytes));
}
页面大小从1.5Mb减少到680Kb。这么少的努力就很好。然后,我了解了SessionPageStatePersister并像this answer所示使用它:
PageStatePersister pageStatePersister;
protected override PageStatePersister PageStatePersister
{
get
{
return pageStatePersister ??
(pageStatePersister = new SessionPageStatePersister(this));
}
}
仅此一项,页面大小就从1.5Mb变为450Kb。也不错!我了解这会在服务器上使用更多的内存,但是考虑到我很少有十个以上的用户,平均只有2-3个用户,所以我认为这不会很快成为问题。在这一点上,使用SessionPageStatePersister解决方案听起来不错。我已经测试了使用最频繁的页面,没有发现任何问题。所以我的问题是:
我是否缺少任何有关Viewstate / Sessionstate的潜在问题或更好的解决方案?
我知道我可以浏览每个页面并对其进行优化,或者开发自定义的PageStatePersister,并进行常规的网页优化。对于这个问题,我对这种解决方案不感兴趣。例如,我想听听使用SessionPageStatePersister可能会导致数据丢失的原因,因为无论是什么。