文章轉載自: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