SessionPageStatePersister是正确的选择吗?

时间:2018-08-31 18:51:31

标签: asp.net webforms session-state viewstate

我有一个基本的常规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可能会导致数据丢失的原因,因为无论是什么。

0 个答案:

没有答案