2009-09-08 120 views
10

Global.asax.cs擴展的HttpApplication類是否在應用程序的生命週期中存在?ASP.NET HttpApplication生命週期

什麼時候可以創建/銷燬實例?

我正在體驗application_start兩次觸發,它似乎與應用程序池回收和部分請求中的某些方面有關。我還沒有完全調試過,現在還沒有時間深入研究。那麼,關於上述問題,下面是一個安全的解決方案嗎?

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static object syncLock = new object(); 
    public static bool applicationBooted; 

    protected void Application_Start() 
    { 
     if(!applicationBooted) 
     lock (syncLock) 
     if(!applicationBooted) 
     { 
      // bootstrap here 
      applicationBooted = true; 
     } 
    } 
} 
+0

你發現你的問題是什麼?我有非常類似的問題。 – 2010-09-13 16:22:00

+0

@Piotr我認爲這是一個紅色的鯡魚,我想我的啓動代碼中的其他地方有一個線程問題,並且發送了兩個最初的請求讓它變得有趣。不記得了,對不起 – 2010-09-13 16:38:53

回答

4

從MSDN網絡上的網頁,

已初始化所有的核心應用程序對象後,應用程序 通過創建的 的HttpApplication類的實例啓動。如果 應用程序有一個Global.asax文件, ASP.NET而不是創造的 是從HttpApplication類派生 和 使用派生類來表示 應用在Global.asax類的實例。

ASP.NET Application Life Cycle Overview

+4

它不能解釋它爲什麼被創建或只是被稱爲兩次的事件。 – 2010-09-13 16:21:28

6

如果你在你的日誌中看到兩次的情況下,檢查應用程序池設置爲產生一個單一的工作進程。每個工作進程將創建自己的HttpAppication實例。

+0

不應該app_start仍然只能被觸發一次嗎?我不想要> 1個工作進程? – 2009-09-08 13:45:41

+1

當您將應用程序池配置爲使用> 1工作進程運行時,您在Web園模式下運行。每個進程都與其他進程隔離並運行其自己的管道實例。 – 2009-09-08 14:02:45

+0

這是否意味着您可以爲同一個IIS站點獲得許多w3wp.exe? – 2009-09-08 15:09:21