如果你有在IE中檢視目前浏覽頁面HTML源代碼的習慣,你也許常會看到類似以下的代碼片斷:
<input type="hidden" name="__VIEWSTATE" value=
"dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG ……
聰明的你一定會問,這是什麼?有什麼作用?它與本篇文章有何轉折親關系?各位看官,且聽我慢慢道來。
其實,這就是MS在ASP.NET應用ViewState技術的特征表現。為了頁面能在PostBack後依然能讀取伺服器控件原有的狀态資料,而ASP.NET應用ViewState技術本質上是用一個預設名稱為"__VIEWSTATE的 Hidden類型表單域來儲存和傳遞資料(這些資料是經過了序列化後Base64編碼的字元串值,且是在方法 Page.SavePageStateToPersistenceMedium輸出前儲存、并由 Page.LoadPageStateFromPersistenceMedium加載)。雖然我們可以通過三種級别來輕松禁用掉這些資料的往返傳遞:
Machine級 在machine.config中設定< pages enableViewStateMac='false' />
Application級 在Web Applicatin的web.config中設定< pages enableViewStateMac='false' />
單頁面級 在該頁面中設定< enableViewStateMac='false' %>或通過代碼設定Page.EnableViewStateMac = false;
可是,如果我們完全能通過禁用ViewState來解決資料傳輸負擔而且不産生副作用的話,那MS的架構師們也不會傻到如此可愛的地步(可有可無的東東留它何用?),正因我們往往不能通過簡單的禁用來解決這個傳輸負擔問題,是以我們隻能另辟路徑使之在網絡往返中傳輸量盡可能地小,于是,壓縮成了我們的首選。隻要我們重載Page類的 SavePageStateToPersistenceMedium()方法與 LoadPageStateFromPersistenceMedium()方法,并在重載方法中對資料進行壓縮與解壓的處理即可。開源項目SharpZipLib提供的類GZipInputStream與GZipOutputStream進入了我們的視野,為了友善,不妨寫個類CompressionHelper,代碼如下:
using System.IO; using ICSharpCode.SharpZipLib.GZip; namespace Ycweb.Components { /**//// <summary> /// Summary description for CompressionHelper. /// </summary> public class CompressionHelper { public CompressionHelper() { // TODO: Add constructor logic here } /**//// <summary> /// 壓縮資料 /// </summary> /// <param name="data">待壓縮的位元組數組</param> /// <returns>壓縮後的位元組數組</returns> public static byte[] CompressByte(byte[] data) { MemoryStream ms = new MemoryStream(); Stream s=new GZipOutputStream(ms); s.Write( data, 0, data.Length ); s.Close(); return ms.ToArray(); } /**//// <summary> /// 解壓資料 /// </summary> /// <param name="data">待解壓的位元組數組</param> /// <returns>解壓出的位元組數組</returns> public static byte[] DeCompressByte(byte[] data) { byte[] writeData = new byte[2048]; MemoryStream ms= new MemoryStream( data ); Stream sm = new GZipInputStream(ms) as Stream; MemoryStream outStream = new MemoryStream(); while (true) { int size = sm.Read(writeData,0, writeData.Length ); if (size >0) { outStream.Write(writeData,0,size); } else { break; } } sm.Close(); byte[] outArr = outStream.ToArray(); outStream.Close(); return outArr; } } }
本文轉自左正部落格園部落格,原文連結:http://www.cnblogs.com/soundcode/archive/2010/12/28/1918934.html,如需轉載請自行聯系原作者