2010-08-19 18 views
2

ASP .NET應用程序啓動多少次?ASP .NET應用程序啓動多少次?

我想每個AppDomain運行一次(特別是RegisterRoutes)。如果我把我想在Application_Start中的global.asax中執行的代碼放在一起,那麼一切都很好(似乎是這樣),代碼似乎只執行一次。

但如果我有在web.config中註冊的自定義HTTP模塊,它具有以下功能:

public class SomeHttpModule:IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     new SomeRunner().Run(); 
    } 

    public void Dispose() 
    { 
    } 
} 

public class SomeRunner 
{ 
    private static object syncLock = new object(); 
    private static bool hasRun; 

    public void Run() 
    { 
     lock(syncLock) 
     { 
      if (!hasRun) 
      { 
       hasRun = true; 
       RegisterRoutes(); 
      } 
     } 
    } 

    public void RegisterRoutes() 
    { 
     // Register MVC Routes 
    } 
} 

當我打「走出去」在Visual Studio中,我的調試器在我的斷點停止在第一線Run方法......但是如果我檢查RouteTable.Routes集合... lo和behlold ... MVC路由已經被註冊(意味着RegisterRoutes必須已經被調用)...即使hasRun是假的!

這是在Visual Studio中調試IIS網站時出現的一些奇怪現象嗎?我知道IIS可以在一個AppDomain中託管兩個HttpApplications,並且這會讓SomeHttpModule在相同的AppDomain中獲得兩次Init_d ...對吧?但是,我的靜態布爾hasRun仍然可能是假的?

謝謝。

+0

你是否也在'Application_Start'中調用'RegisterRoutes()'? – 2010-08-19 06:03:26

+0

大聲笑,不,我不:) – Jeff 2010-08-19 06:15:44

回答

1

Web應用程序可以啓動很多次。只要IIS認爲它沒有被使用,應用程序就可以關閉,並且當下一個請求進入應用程序時將再次開始。

此外,應用程序可能設置爲每日回收,在這種情況下,它將每天至少啓動一次。

我不確定爲什麼應用程序在調試時啓動兩次,但它可能與調試器如何連接到進程有關。

靜態變量不能從應用程序的一個實例繼續存在的原因是它們是單獨的實例。當應用程序再次啓動時,它將從它自己的一組變量開始。它開始於一個全新的虛擬地址空間,所以前一個實例沒有任何東西。

+0

但爲什麼是RouteTable.Routes堅持,但不hasRun? – Jeff 2010-08-19 13:45:56

+0

出於某種原因,我無法在發佈模式下重現此操作...我認爲這可能是一種調試奇怪的現象......儘管如此,我仍然會接受該答案,以便結束該問題。 – Jeff 2010-08-30 13:42:38

相關問題