天天看點

淺析ASP.NET應用ViewState技術

如果你有在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,如需轉載請自行聯系原作者

繼續閱讀