项目报表页面viewState大小超过200K,页面体积很大,必须得将之瘦身,现在很流行身材苗条。。。。。

执行之前

先重载Page中的两个方法:

1、SavePageStateToPersistenceMedium

SavePageStateToPersistenceMedium 方法使用 PageStatePersister 属性所引用的 System.Web.UI.PageStatePersister 对象的 Save 方法存储页的视图状态和控件状态信息。

ASP.NET 包括 PageStatePersister 类的两个子类:在 ASP.NET 页包含的隐藏字段中保存状态信息的 HiddenFieldPageStatePersister 类和在与请求关联的 Session 对象中保存状态的 SessionPageStatePersister 类。 注意,使用SessionPageStatePersister 类时,隐藏的 VIEWSTATE 字段仍将像用于确定回发时那样呈现。

若要在您选择的位置保存状态,应创建 PageStatePersister 类的新子类,它可将状态保存并加载到您所选择的持久性介质中。 有关创建新的 PageStatePersister 对象的示例,请参见 PageStatePersister 类。

使用 .NET Framework 1.0 版或 1.1 版时,如果要从隐藏字段外的其他任何位置保存 Page 状态,则请重写此方法。 如果选择这样做,还必须重写 LoadPageStateFromPersistenceMedium 方法。

2、LoadPageStateFromPersistenceMedium

LoadPageStateFromPersistenceMedium 方法使用 PageStatePersister 属性所引用的 System.Web.UI.PageStatePersister 对象的 Load 方法来为 Page 对象加载任何保存的视图状态信息。

ASP.NET 包括 PageStatePersister 类的两个子类:在 ASP.NET 页包含的隐藏字段中保存状态信息的 HiddenFieldPageStatePersister 类和在与请求关联的 Session 对象中保存状态的 SessionPageStatePersister 类。

若要在您选择的位置保存状态,应创建 PageStatePersister 类的新子类,它可将状态保存并加载到您所选择的持久性介质中。 有关创建新的 PageStatePersister 对象的示例,请参见 PageStatePersister 类。

使用 .NET Framework 1.0 版或 1.1 版时,如果要从隐藏字段外的其他任何位置加载 Page 状态,则请重写此方法。 如果选择这样做,还必须重写 SavePageStateToPersistenceMedium 方法。

一、压缩viewState

先准备GZipHelper类

GZipHelper /// <summary>/// GZip压缩解压缩帮助类/// </summary>public class GZipHelper{/// <summary>/// GZip压缩/// </summary>/// <param name="data">The data.</param>/// <returns></returns>public static byte[] Compress(byte[] data){MemoryStream ms = new MemoryStream();GZipStream stream = new GZipStream(ms, CompressionMode.Compress);stream.Write(data, 0, data.Length);stream.Close();return ms.ToArray();}/// <summary>/// GZip解压缩/// </summary>/// <param name="data">The data.</param>/// <returns></returns>public static byte[] Decompress(byte[] data){MemoryStream ms = new MemoryStream();ms.Write(data, 0, data.Length);ms.Position = 0;GZipStream stream = new GZipStream(ms, CompressionMode.Decompress);MemoryStream temp = new MemoryStream();byte[] buffer = new byte[1024];while (true){int read = stream.Read(buffer, 0, buffer.Length);if (read <= 0){break;}else{temp.Write(buffer, 0, buffer.Length);}}stream.Close();return temp.ToArray();}}

重载SavePageStateToPersistenceMedium

SavePageStateToPersistenceMediumprotected override void SavePageStateToPersistenceMedium(object state){string viewState = new ObjectStateFormatter().Serialize(state);byte[] data = Convert.FromBase64String(viewState);byte[] compressedData = ViewStateHelper.Compress(data);string str = Convert.ToBase64String(compressedData);ClientScript.RegisterHiddenField("__ARGVVIEWSTATE", str);}

重载LoadPageStateFromPersistenceMedium

LoadPageStateFromPersistenceMediumprotected override object LoadPageStateFromPersistenceMedium(){string viewstate = Request.Form["__ARGVVIEWSTATE"];byte[] data = Convert.FromBase64String(viewstate);byte[] uncompressedData = ViewStateHelper.Decompress(data);string str = Convert.ToBase64String(uncompressedData);return new ObjectStateFormatter().Deserialize(str);}

结果:较以前页面大小减少了50%,但是所耗CPU要大,耗时要长。

二、保存viewState到服务器

Savestatic private System.IO.DirectoryInfo Dir = new System.IO.DirectoryInfo(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\ViewState\"));protected override void OnPreInit(System.EventArgs e){if (!Dir.Exists)Dir.Create();else{DateTime nt = DateTime.Now.AddSeconds(-5);foreach (System.IO.FileInfo f in Dir.GetFiles()){if (f.CreationTime < nt)f.Delete();}}base.OnPreInit(e);}/// <summary>/// Saves any view-state and control-state information for the page./// </summary>/// <param name="state"></param>protected override void SavePageStateToPersistenceMedium(object state){string value = new ObjectStateFormatter().Serialize(state);string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码   string fn = System.IO.Path.Combine(Dir.FullName, viewStateID);System.Threading.ThreadPool.QueueUserWorkItem((obj) => System.IO.File.WriteAllText(fn, value)); //或者只写 File.WriteAllText(fn, value)Cache.Insert(viewStateID, value);base.SavePageStateToPersistenceMedium(viewStateID);}/// <summary>/// 将所有保存的视图状态信息加载到 <see cref="T:System.Web.UI.Page"/> 对象。/// </summary>/// <returns>保存的视图状态。</returns>protected override object LoadPageStateFromPersistenceMedium(){string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;string stateStr = (string)Cache[viewStateID];if (stateStr == null){string fn = System.IO.Path.Combine(Dir.FullName, viewStateID);stateStr = System.IO.File.ReadAllText(fn);}elseCache.Remove(viewStateID);return new ObjectStateFormatter().Deserialize(stateStr);}

结果:ViewState从原来的保存在页面变成保存到了服务器,页面viewState大小为0,大大减少页面大小。但是要多做一个清除服务器历史viewstate数据操作。

转载于:https://www.cnblogs.com/ivanyb/archive/2011/12/03/2274848.html

页面瘦身之压缩viewState和保存viewState到服务器相关推荐

  1. ppt文件太大怎么变小瘦身?

    ppt文件太大怎么变小瘦身?太大的PPT文件在打开演示以及保存的时候会出现卡顿的现象,并且如果我们要使用邮箱发送的话,也会因PPT文件太大,导致上传附件不成功而影响工作.那如果我们的PPT文件出现以上 ...

  2. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

  3. 将保存的2G视频压缩成50M,居然这么简单?该给视频来波瘦身了

    很多朋友都喜欢看视频,所以手机中经常会有很多的视频资源,而且不少人对于视频的画质都非常讲究,不是蓝光?不看!所以往往缓存的视频都非常大,很占手机空间. 不知道你是不是其中一员呢?如果你也为视频的保存感 ...

  4. APK瘦身记,怎样实现高达53%的压缩效果

    作者:非戈@阿里移动安全,很多其它技术干货.请訪问阿里聚安全博客 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式.关于这个话题事实上是一个老生常谈的题目.不论是公司内部.还是外 ...

  5. 压缩vmware中的ubuntu系统(虚拟机瘦身大法)

    压缩vmware中的ubuntu系统(虚拟机瘦身大法) 前提:你的虚拟机大小 <= 你放置虚拟机的磁盘的剩余空间 1.在Termial(终端)里 运行"sudo vmware-tool ...

  6. Android apk瘦身之使用TinyPng压缩图片

    1 前言 Android apk太大了怎么办,有的时候需要减小apk的体积,例如上传到服务器的时候有文件大小的限制.百度一下,发现大致有以下几种方法: 使用混淆,减少代码体积 删除不使用的资源 减少使 ...

  7. PDF文件太大怎么压缩?用这个方法能够一键瘦身

    作为工作学习中使用频率较高的文档类型,PDF格式具有兼容性.稳定性.安全性等优点,PDF格式是我们在网络传输中经常需要用到的一种传输格式,但是大家有没有发现,我们在进行PDF文件传输的时候,往往PDF ...

  8. APK瘦身记,如何实现高达53%的压缩效果

    原文链接:http://drops.wooyun.org/mobiledev/14289#more-14289 0x00 我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话 ...

  9. SpringBoot-Maven打包压缩瘦身

    SpringBoot-Maven打包压缩瘦身 一.Spring Boot 可执行 jar 分析 1.1 打包 1.2 两种 jar 的比较 1.3 一次打包两个 jar 二.SpringBoot迭代发 ...

最新文章

  1. 【top-k】Answering Topk Queries with MultiDimensional Selections: The Ranking Cube Approach
  2. python创建dataframe表格不显示_创建列pandas DataFrame数据的表绘图时出现问题?
  3. 企业信息化投入中咨询服务_全过程工程咨询服务核心价值是什么
  4. LeetCode--81. 搜索旋转排序数组Ⅱ(遍历法,二分法)
  5. springboot+openFeign+nacos开发实战
  6. POJ-10031004
  7. list.h双循环链表的实现,拷贝自Linux内核(2.6.20.1)
  8. knn算法python代码识别手写数字_python使用KNN算法识别手写数字
  9. 性能优化实战-sql递归查询效率低下
  10. 使用 spring.profiles.active 及 @profile 注解 动态化配置内部及外部配置
  11. 再好的技术,再完美的规章,也无法取代人自身的素质和责任心
  12. gnuplot使用简介
  13. excel筛选时保留下面某些行不被筛选
  14. textarea研究
  15. 大话系列 | 逻辑回归的入门与优化
  16. 蓝桥杯 算法提高 卡勒沃夫之弱水路三千(提高型)
  17. FlexRay学习笔记_2
  18. 常用JS操作(复选框、单选框、下拉框)
  19. 百度地图 热力图及轨迹图展示
  20. 华为nova7可以用鸿蒙,华为鸿蒙系统再次更新7款可适配机型!对比安卓,鸿蒙OS的优势有哪些?...

热门文章

  1. VTK:PolyData之PointLocator
  2. VTK:InfoVis之ParallelCoordinatesView
  3. VTK:IO之ExportPolyDataScene
  4. VTK:Filtering之TransformPolyData
  5. WebAssembly的Qt
  6. Qt Creator创建可缩放的按钮和边框
  7. C语言实现二分法检索binary search(附完整源码)
  8. QT的QSplitter类的使用
  9. 指令系统寻址方式——指令寻址,数据寻址
  10. The TensorFlow library wasn‘t compiled to use SSE instructions, but these are available on your mach