一個bug引發的思考 — ASP.NET頁面載入順序討論

來源:互聯網
上載者:User

文章轉載自:http://it.dianping.com/asp_net_page_load_order_problem_discussion.htm

前段時間遇到一個比較奇怪的case,情況是這樣的,我在主版頁面render的時候會吐一些效能資料(例如Sql執行次數)用作監控,但總感覺每次 監控的資料內容都不全,明明load某張頁面應該是需要執行10條sql,結果監控只監控到8條或9條。但單步調試卻發現所有sql都是執行的,那沒有監 控到的sql到底飛哪去了呢?

首先定位有問題的那句sql,我找到了沒有被監控的sql語句是在使用者控制項的render事件裡執行的。我大概猜到了問題的所在,可能由於頁面載入次序的問題導致了監控數值還沒統計完就render出來了?於是去翻了一下msdn,根據MSDN的記載(詳見:http://msdn.microsoft.com/zh-cn/library/dct97kc3.aspx),頁面的載入順序是這樣的:

主版頁面控制項 Init 事件。
內容控制項 Init 事件。
主版頁面 Init 事件。
內容頁 Init 事件。
內容頁 Load 事件。
主版頁面 Load 事件。
內容控制項 Load 事件。
內容頁 PreRender 事件。
主版頁面 PreRender 事件。
主版頁面控制項 PreRender 事件。
內容控制項 PreRender 事件。

這邊只是列出了prerender事件,而我需要的是render事件的觸發順序,所以我自己寫了一個程式做測試,結果如下:

內容頁 控制項 init
主版頁面 控制項 init
主版頁面 init
內容頁 init
內容頁 load
主版頁面 load
內容頁控制項 load

主版頁面控制項 load

內容頁 prerender
主版頁面 prerender
內容頁 控制項 prerender

主版頁面 控制項 prerender

內容頁 prerender complete

內容頁 render
主版頁面 render
內容頁 控制項 render

主版頁面 控制項 render

問題確實出在頁面的載入順序問題上。因為主版頁面的render事件在內容頁控制項的render事件之前,所以我是先output了統計值,再執行那條sql語句。由此造成了監控資料的不正確。

簡單想了一下解決方案,為了能讓內容頁控制項的sql被監控到,我把執行sql的函數搬到了load事件裡去執行。這個其實從設計角度確實也該如此 做,load就是負責載入資料的,render就是負責顯示資料的,非要把兩步並一步圖省事,到頭來就會碰上這種鳥不拉SHI的問題(- -#)。

同時,我還發現主版頁面控制項是最後render的。所以如果可以把監控的東西放到一個母片的控制項裡,那就可以 handle到內容頁控制項的render裡的sql執行了,呵呵。如果sql代碼很多已經寫到內容頁控制項裡一時半會無法遷移到load裡的話,可以考慮將 監控遷移到母板頁控制項的render裡。

不過不管哪種解決辦法,最根本的是要瞭解頁面的真實載入順序,否則沒法給出對應的解決方案。不過沒啥規律可循的載入順序要記腦子裡也不容易,不如將此文mark一下,等到要用到再翻出來查一下順序,應該會對您今後的開發有協助的,嘿嘿:)

文章中測試代碼需要下載請至原文章頁面:http://it.dianping.com/asp_net_page_load_order_problem_discussion.htm

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.