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

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

發佈了53 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章