將viewstate內容轉移到檔案

來源:互聯網
上載者:User

ASP.NET裡不可避免的要用上viewstate,怎麼用它估計大家都用得爛熟了,它的優點缺點用過的人也能說出個大概.其中被說得最多的還是它的缺點,viewstate的使用使得頁面大小長胖了好幾KB,甚至上M,最直接的效應就是使得頁面的載入異常的緩慢.因此對於viewstate的使用及最佳化是那些ASPDotNet最佳化教程裡談論得較多的,至於那些怎麼禁用viewstate,緩衝策略等也就不詳細討論了.
如果不嫌IO操作慢,並且伺服器也夠地方放,何不把viewstate的內容儲存在伺服器上,這樣可以實現用戶端頁面的viewstate大小為0,實現起來也很簡單,只不過是重寫了Page類的兩個虛方法SavePageStateToPersistenceMedium和LoadPageStateFromPersistenceMedium,以下是簡單的實現方法.

儲存viewstate
 1// 對於DotNet 1.1 可採用 LosFormatter
 2        ObjectStateFormatter m_stateFormatter;
 3        private ObjectStateFormatter StateFormatter
 4        {
 5            get
 6            {
 7                if (m_stateFormatter == null)
 8                {
 9                    m_stateFormatter = new ObjectStateFormatter();
10                }
11                return m_stateFormatter;
12            }
13        }
14
15        /**//// <summary>
16        /// 重寫SavePageStateToPersistenceMedium
17        /// 儲存viewstate內容到文本中
18        /// </summary>
19        /// <param name="state"></param>
20        protected override void SavePageStateToPersistenceMedium(object state)
21        {
22            FileStream fs = new FileStream(GetFileName(), FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
23            StateFormatter.Serialize(fs, state);
24            fs.Close();
25        }
26
27        /**//// <summary>
28        /// 重寫LoadPageStateFromPersistenceMedium
29        /// 從文本中讀取viewstate內容
30        /// </summary>
31        /// <returns></returns>
32        protected override object LoadPageStateFromPersistenceMedium()
33        {
34            FileStream fs = new FileStream(GetFileName(), FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
35            object viewStatObject = StateFormatter.Deserialize(fs);
36            fs.Close();
37            return viewStatObject;
38        }
39
40        protected override void OnInit(EventArgs e)
41        {
42            // 給session賦值,以保證每次請求的不建立新的session
43            Session["a"] = "temp";
44            base.OnInit(e);
45        }
46
47        /**//// <summary>
48        /// 產生並擷取檔案路徑
49        /// </summary>
50        /// <returns></returns>
51        private string GetFileName()
52        {
53            // 以sessionid 和 請求路徑 組成 儲存viewstate的檔案名稱
54            string url = Request.RawUrl.Replace("/", "");
55            return "E:\\" + Session.SessionID + "_" + url + "_viewstate.txt";
56        }

最後的效果就是,查看頁面的html代碼,發現viewstate的value是空的.1 <input type="hidden" name="__VIEWSTATE" id="
2 __VIEWSTATE" value="" />

另外對於Page類還有很多虛方法,好好應用還是挺有趣的.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.