ASP.NET Application_Start事件的問題

摘要: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物件中。

這樣能使環境變數的存取錯誤例外落在這個環境變數的物件中,

使得除錯的焦點集中在這裡。