摘要:ASP.NET Application_Start事件的問題
以自己本身的設計觀點來說,ASP.NET所提供的Application物件用來存放程式的環境變數是最適當的設計,
而將這些環境變數初始化的最佳時間點是Web AP建構出來的時候,
不過,如果使用的是Web Site的專案,並且使用Global.asax來做初始化環境變數的時候,
就不能直接的使用建構子來做初始化作業,
這時候,就得依賴Application_Start的事件,
處理的方式是把所需要的環境變數初始化,並且以約定好的索引值存放到Application物件中,
在通常的狀況下,這樣子做並沒有什麼問題,
不過,如果資料來自於其他外部的資料來源的時候,例如,資料庫。
而且又發生了資料庫無法連接的情況下,就會發生例外。
如果說,程式就這樣中斷無法執行,那就不會有什麼問題,
這時候,程式將會在例外狀況排除後,即可正常動作,
但是,在ASP.NET的事件中所發生的例外,最終都會被ASP.NET的例外處理機制所捕捉,
然後就產生我們常常看到的例外畫面網頁,
這時候,對於整個Web AP來說,這樣子並不會使AP無法正常工作,
因此,如果我們在Application_Start的事件程序中發生了錯誤而產生例外,
這使得我們程式的環境變數並沒有初始化成功,
使用者會看到例外畫面,但是程式會繼續執行,
以自己的使用習慣來說,當我連到一張網頁時,如果發生了錯誤,
我可能會重新載入一次,
這樣的結果,可能重新載入的網頁並沒有存取到環境變數而安全過關,
而這個錯誤將會到存取環境變數的時候才會被發現,
不過,這時候所看到的可能跟這個真正的原因完全不相干的內容,
可能會造成除錯上的困難。
後來,想到了一個解決的方式,
將初始化環境變數的時機延後到第一次存取,
這樣的話,就算第一次存取發生了例外,
也可以在下一次再嘗試初始化,
而環境變數則包裝成一個物件,
在Application_Start的事件初始化,並存取到Application物件中。
這樣能使環境變數的存取錯誤例外落在這個環境變數的物件中,
使得除錯的焦點集中在這裡。