页面瘦身之压缩viewState和保存viewState到服务器
項目報表頁面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
?
結果:較以前頁面大小減少了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到服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 助农贷款需要什么条件
- 下一篇: 铜钱什么永通宝