ASP.NET MVC - 在網站執行路徑中寫入檔案造成HttpApplication重新載入問題

限量最近在新公司寫系統架構,為了方便Debug就需要先完成Log模組,在寫檔時,因為很偷懶的直接在執行路徑底下建立一個log的資料夾寫入檔案,一切聽起來都很完美,在Console Application上也測試OK。就在ASP.NET MVC專案上執行時,竟然發現一個很大的問題。問題就是在進入網頁時HttpApplication會被產生多次。這個問題經過限量多次縮小範圍抽絲剝繭才找到問題原因。



先在來說明問題的影響狀況。根據IIS Lifecycle,在第一次啟動ASP.NET Application Proccess時會產生一個HttpApplication,因為限量在HttpApplication載入設定時會啟動自己架構的Kernel,讓架構內的模組Ready,這必須要保證Kernel為Singleton。但是HttpApplication產生多次的結果會造成Kernel有多個,此時Log寫檔就會變成多個Log模組在搶著寫檔案造成Lock。

經過長時間的追蹤總算找到問題所在,這個問題在於

IIS預設在執行路徑(BIN資料夾)下內容改變時,會進行回收的動作!!

這就要怪限量對IIS的了解實在太淺了,查了MSDN發現這段敘述:



這段敘述說明IIS預設的回收行為是產生一個新的Process,難怪HttpApplication會再產生一次。

接著就來說明如何解決這個窘境了。解決方法有兩種,一種為不要對BIN資料夾內的東西做任何變動(CRUD),這種方法比較算是逃避式的作法;另一種方式為進到IIS設定區改變設定,修改如下:
到進入[Internet Information Service] => [應用程式集區] => [DefaultAppPool] => [進階設定] => [回收] =>將 [停用設定變更時的回收]設定為True就完成了。



經過這次的經驗,限量覺得如果應該要將IIS摸熟之後再來寫ASP.NET Web Application會比較有幫助,看來大概找到下次主題的方向了。




參考來源:

StackOverflow - Does any change in any file inside bin folder cause application recycle in ASP.NET web application?
MSDN - IIS Proccess Recycling




留言