Asp.net

ASP.NET:壓縮 ViewState

  • February 22, 2013

壓縮 ASP.NET ViewState 內容的最新和最好的方法是什麼?

這個性能怎麼樣?保持頁面快速並最小化數據流量是否值得?

我該怎麼做:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
value="/wEPDwUKMTM4Mjc3NDEyOWQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgkFLGN0b
DAwJENvbnRlbnRQbGFjZUhvbGRlcl9NYWluQ29udGVudCRSYWRCdXQxBSxjdGwwMCRDb250ZW50UGxhY2VIb
2xkZXJfTWFpbkNvbnRlbnQkUmFkQnV0MQUsY3RsMDAkQ29udGVudFBsYWNlSG9sZGVyX01haW5Db250ZW50J
FJhZEJ1dDIFLGN0bDAwJENvbnRlbnRQbGFjZUhvbGRlcl9NYWluQ29udGVudCRSYWRCdXQyBSxjdGwwMCRDb
250ZW50UGxhY2VIb2xkZXJfTWFpbkNvbnRlbnQkUmFkQnV0MwUsY3RsMDAkQ29udGVudFBsYWNlSG9sZGVyX
01haW5Db250ZW50JFJhZEJ1dDQFLGN0bDAwJENvbnRlbnRQbGFjZUhvbGRlcl9NYWluQ29udGVudCRSYWRCd
XQ0BSxjdGwwMCRDb250ZW50UGxhY2VIb2xkZXJfTWFpbkNvbnRlbnQkUmFkQnV0NQUsY3RsMDAkQ29udGVud
FBsYWNlSG9sZGVyX01haW5Db250ZW50JFJhZEJ1dDXz21BS0eJ7991pzjjj4VXbs2fGBw==" />

進入這樣的事情:

<input type="hidden" name="__VIEWSTATE"  id="__VIEWSTATE" 
value="/wEPDwUKMTM4Mjc3N==" />

同樣,在對此進行一些研究之後,我在一篇關於Compressing View State的部落格文章中總結了我的發現。

為了保存壓縮的視圖狀態,這就是我所做的:

protected override void SavePageStateToPersistenceMedium(object state) {
   SaveCompressedPageState(state);
}

private void SaveCompressedPageState(object state) {
   byte[] viewStateBytes;
   using(MemoryStream stream = new MemoryStream()) {
       ObjectStateFormatter formatter = new ObjectStateFormatter();
       formatter.Serialize(stream, state);
       viewStateBytes = stream.ToArray();
   }

   byte[] compressed = CompressionHelper.Compress(viewStateBytes);
   string compressedBase64 = Convert.ToBase64String(compressed);

   ClientScript.RegisterHiddenField(ViewStateFieldName, compressedBase64);
}

對於載入部分,這段程式碼使它對我有用:

protected override object LoadPageStateFromPersistenceMedium() {
   return LoadCompressedPageState();
}

private object LoadCompressedPageState() {
   string viewState = Request.Form[ViewStateFieldName];
   if(string.IsNullOrEmpty(viewState)) {
       return string.Empty;
   }

   byte[] decompressed = CompressionHelper.Decompress(viewState);
   string decompressedBase64 = Convert.ToBase64String(decompressed);

   ObjectStateFormatter formatter = new ObjectStateFormatter();
   return formatter.Deserialize(decompressedBase64);
}

引用自:https://stackoverflow.com/questions/2380106