亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

小議優化ASP.NET應用性能之ViewState篇

2019-11-18 17:04:53
字體:
來源:轉載
供稿:網友

    如果你有在IE中查看當前瀏覽頁面HTML源代碼的習慣,你也許常會看到類似以下的代碼片斷:
<input type="hidden" name="__VIEWSTATE" value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
……

  聰明的你一定會問,這是什么?有什么作用?它與本篇文章有何轉折親關系?各位看官,且聽我慢慢道來。
  其實,這就是MS在asp.net應用ViewState技術的特征表現。為了頁面能在PostBack后依然能讀取服務器控件原有的狀態數據,Asp.net中使用了ViewState技術,而ViewState技術本質上是用一個默認名稱為"__VIEWSTATE的Hidden類型表單域來保存和傳遞數據(這些數據是經過了序列化后Base64編碼的字符串值,且是在方法Page.SavePageStateToPersistenceMedium輸出前保存、并由Page.LoadPageStateFromPersistenceMedium加載)。雖然我們可以通過三種級別來輕松禁用掉這些數據的往返傳遞:

Machine級 在machine.config中設置<pages enableViewStateMac='false' />
application級 在Web Applicatin的web.config中設置<pages enableViewStateMac='false' />
單頁面級 在該頁面中設置<%@Page enableViewStateMac='false' %>或通過代碼設置Page.EnableViewStateMac = false;
 
  可是,如果我們完全能通過禁用ViewState來解決數據傳輸負擔而且不產生副作用的話,那MS的架構師們也不會傻到如此可愛的地步(可有可無的東東留它何用?),正因我們往往不能通過簡單的禁用來解決這個傳輸負擔問題,所以我們只能另辟路徑使之在網絡往返中傳輸量盡可能地小,于是,壓縮成了我們的首選。只要我們重載Page類的SavePageStateToPersistenceMedium()方法與LoadPageStateFromPersistenceMedium()方法,并在重載方法中對數據進行壓縮與解壓的處理即可。開源項目SharpZipLib提供的類GZipInputStream與GZipOutputStream進入了我們的視野,為了方便,不妨寫個類ComPRessionHelper,代碼如下:

 1using System.IO;
 2using ICSharpCode.SharpZipLib.GZip;
 3
 4namespace Ycweb.Components
 5{
 6    /**//// <summary>
 7    /// Summary description for CompressionHelper.
 8    /// </summary>
 9    public class CompressionHelper
10    {
11        public CompressionHelper()
12        {
13            //
14            // TODO: Add constructor logic here
15            //
16        }
17
18        /**//// <summary>
19        /// 壓縮數據
20        /// </summary>
21        /// <param name="data">待壓縮的字節數組</param>
22        /// <returns>壓縮后的字節數組</returns>
23        public static byte[] CompressByte(byte[] data)
24        {
25            MemoryStream ms = new MemoryStream();
26            Stream s=new GZipOutputStream(ms);   
27            s.Write( data, 0, data.Length );
28            s.Close();
29            return ms.ToArray();   
30        }
31
32        /**//// <summary>
33        /// 解壓數據
34        /// </summary>
35        /// <param name="data">待解壓的字節數組</param>
36        /// <returns>解壓出的字節數組</returns>
37        public static byte[] DeCompressByte(byte[] data)
38        {
39            byte[] writeData = new byte[2048];
40            MemoryStream ms= new MemoryStream( data );
41            Stream sm = new GZipInputStream(ms) as Stream;
42            MemoryStream outStream = new MemoryStream();
43            while (true)
44            {
45                int size = sm.Read(writeData,0, writeData.Length );
46                if (size >0)
47                {
48                    outStream.Write(writeData,0,size);
49                }
50                else
51                {
52                    break;
53                }
54            }
55            sm.Close();
56            byte[] outArr = outStream.ToArray();
57            outStream.Close();
58            return outArr;   
59        }
60    }
61}      然后我們在派生于類Page的頁面控制基類中重載方法LoadPageStateFromPersistenceMedium()與SavePageStateToPersistenceMedium(Object viewState),代碼如下:
 1Load & Save ViewState Data#region Load & Save ViewState Data
 2        protected override object LoadPageStateFromPersistenceMedium()
 3        {
 4//從自己注冊的隱藏域__SmartViewState中讀取數據
 5            string viewState = Request.Form["__SmartViewState"];
 6            byte[] bytes = Convert.FromBase64String(viewState);
 7            //調用上面提供的靜態方法CompressionHelper.DeCompressByte()來解壓數據
 8            bytes = CompressionHelper.DeCompressByte(bytes);
 9            LosFormatter formatter = new LosFormatter();
10            return formatter.Deserialize(Convert.ToBase64String(bytes));
11   
12        }
13
14        protected override void SavePageStateToPersistenceMedium(Object viewState)
15        {
16            LosFormatter formatter = new LosFormatter();
17            StringWriter writer = new StringWriter();
18            formatter.Serialize(writer, viewState);
19            string viewStateString = writer.ToString();
20            byte[] bytes = Convert.FromBase64String(viewStateString);
21            //調用上面提供的靜態方法CompressionHelper.CompressByte()來壓縮數據
22            bytes = CompressionHelper.CompressByte(bytes);
23           
24            //注冊一個新的隱藏域__SmartViewState,你也可以自己定義
25            this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));   
26        }
27#endregion
   經過以上處理,web輸出頁面中的源代碼就是型如:
<input type="hidden" name="__SmartViewState" value="H4sIAPtPoNwA/81ce1PbWJb/ ……
<input type="hidden" name="__VIEWSTATE" value="" />
    原來的隱藏域"__VIEWSTATE"值為空,而取而代之的是我們自己注冊的新的隱藏域"__SmartViewState"來存儲了經過壓縮后的字符串,這樣以來,提速效果是明顯的,結合我們的項目,象DG3G.COM的首頁原ViewState串值大約是28K,壓縮后為7K,而Acafa.com的首頁原ViewState串值大約是43K,壓縮后為8K。這樣的處理還是比較令人滿意的。當然,如果你覺得還不夠徹底,你還可以把ViewState串存儲在session中,不過這樣做,對服務器內存的壓力將陡增(尤其是訪問量較大的時候),建議還是不要輕易使用,如果你Web服務器內存有個10G、8G的,不妨試試。下面給出相關修改代碼:
將上述LoadPageStateFromPersistenceMedium()方法體中的代碼:
    string viewState = Request.Form["__SmartViewState"];
修改為:
   string viewState = Session["__SmartViewState"].ToString();
同時,將上述SavePageStateToPersistenceMedium()體中的代碼:
   this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
修改為:
   Session["__SmartViewState"] = Convert.ToBase64String(bytes);

    末了,以上代碼和方案均來自VS2003開發實踐,對VS2005是否合適,本人不做任何承諾,不過如果你能從以上方案中有所收獲,我將感到無比的高興。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日日狠狠久久偷偷四色综合免费| 欧美做受高潮电影o| 国产精品久久久久久亚洲影视| 久久夜精品香蕉| 国产亚洲欧洲黄色| 日韩暖暖在线视频| 久久不射电影网| 日韩在线观看你懂的| 久热国产精品视频| 亚洲国产女人aaa毛片在线| 国产成人精品在线播放| 日韩av理论片| 亚洲精品国产免费| 国产日韩精品视频| 亚洲第一网站免费视频| 91麻豆国产精品| 日韩成人中文字幕在线观看| 97色在线观看免费视频| 欧美一区二区三区精品电影| 欧美日韩美女视频| 91精品久久久久久| 丝袜一区二区三区| 欧美日韩在线观看视频| 欧洲永久精品大片ww免费漫画| 亚洲老头老太hd| 精品小视频在线| 亚洲综合精品一区二区| 亚洲自拍偷拍色片视频| 亚洲精品国产精品久久清纯直播| 国产91|九色| 国产亚洲美女精品久久久| 国产精品嫩草影院久久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲成人xxx| 久久亚洲国产精品| 亚洲一区二区三区sesese| 日本不卡高字幕在线2019| 欧美激情精品久久久久久久变态| 国产午夜精品美女视频明星a级| 4438全国亚洲精品在线观看视频| 17婷婷久久www| 亚洲精品久久久久中文字幕欢迎你| 日本精品中文字幕| 日本精品性网站在线观看| 亚洲欧美日韩精品久久奇米色影视| 激情亚洲一区二区三区四区| 日韩a**站在线观看| 国产亚洲视频中文字幕视频| 国产一区二区三区在线视频| 精品久久久精品| 亚洲白虎美女被爆操| 亚洲天堂av女优| 神马久久桃色视频| 精品伊人久久97| 国产精品欧美久久久| 国外成人免费在线播放| 26uuu另类亚洲欧美日本老年| 亚洲成年网站在线观看| 中文字幕日韩av电影| 亚洲成人动漫在线播放| 日韩欧美999| 欧美黑人极品猛少妇色xxxxx| 日韩成人黄色av| 亚洲永久免费观看| 国产精品wwwwww| 欧美国产日韩中文字幕在线| 精品国内亚洲在观看18黄| 欧美视频第一页| 亚洲欧美制服丝袜| 欧美高清视频在线观看| 日韩在线免费高清视频| 日韩成人在线视频观看| 91香蕉嫩草影院入口| 孩xxxx性bbbb欧美| 国产一区深夜福利| 亚洲精品狠狠操| 亚洲精品电影在线观看| 最新91在线视频| 国产精品精品久久久久久| 在线精品播放av| 久久人人爽人人爽人人片亚洲| 日韩女优在线播放| 日韩在线视频观看正片免费网站| 91av视频在线播放| 久久久之久亚州精品露出| 九九精品视频在线观看| 91极品女神在线| 久久全国免费视频| 欧美激情免费观看| 另类天堂视频在线观看| 欧美视频国产精品| 日韩av中文在线| 精品香蕉在线观看视频一| 成人精品在线视频| 在线观看免费高清视频97| 欧美丝袜一区二区三区| 欧美日本亚洲视频| 欧美激情性做爰免费视频| 国内精品美女av在线播放| 亚洲精品www久久久| 色午夜这里只有精品| 日韩中文字幕在线精品| 国产日韩换脸av一区在线观看| 国产视频欧美视频| 最近2019好看的中文字幕免费| 日韩精品视频在线观看免费| 国产成人精品一区二区在线| 欧美另类老肥妇| 中文字幕国产精品| 亚洲美女黄色片| 亚洲欧美另类中文字幕| 久久精品亚洲一区| 国产网站欧美日韩免费精品在线观看| 亚洲二区在线播放视频| 国产91精品最新在线播放| 国产精品久久久久久久电影| 亚洲欧美日韩直播| 欧美视频国产精品| 国内精品久久久久久影视8| 亚洲无线码在线一区观看| 免费不卡欧美自拍视频| 欧美日韩午夜剧场| 国产一区二区激情| 97超级碰碰碰| 久久精品99久久香蕉国产色戒| 午夜精品一区二区三区在线视| 久久免费视频这里只有精品| 日韩在线精品一区| 久久99精品久久久久久琪琪| 日韩欧美在线视频日韩欧美在线视频| 亚洲的天堂在线中文字幕| 色噜噜久久综合伊人一本| 亚洲成人黄色网| 久久69精品久久久久久国产越南| 中文字幕视频在线免费欧美日韩综合在线看| 久久国产精品免费视频| 欧美性猛交xxxx偷拍洗澡| 久久人人爽亚洲精品天堂| 国产综合在线看| 欧美激情亚洲精品| 久久久久久久香蕉网| 欧美日韩在线影院| 久久艹在线视频| 欧美高跟鞋交xxxxxhd| 亚洲国产精品成人va在线观看| 午夜精品久久久99热福利| 国产日韩av在线| 日韩国产高清视频在线| 日韩av免费一区| 久久久亚洲成人| 亚洲精品日韩欧美| 国产精品自产拍在线观看中文| 亚洲精品国产精品久久清纯直播| 亚洲国产日韩欧美在线99| 亚洲欧美日韩精品| 2019最新中文字幕| 欧美精品在线观看| 社区色欧美激情 | 亚洲色图av在线| 久久777国产线看观看精品| 日本精品久久久久久久| 精品国产91乱高清在线观看| 欧美激情一二三| 国产亚洲精品久久|