2012-01-11 119 views
2

請considerer以下情形:ASP .NET應用程序生命週期+ Singleton實例壽命

  1. 我已經使用ASP .NET MVC 3框架創建一個完整的Web應用程序。現在我的應用程序由一個Web服務器管理。
  2. 在我的應用程序的服務器端收到HTTP請求。
  3. 實現單例設計模式的類在服務器端實例化。
  4. 響應被髮送到瀏覽器。
  5. 在我的應用程序的服務器端收到另一個HTTP請求。步驟2中使用的單例實例在服務器端仍然可用嗎?

我讀到一個ASP .NET應用程序的此頁面上的生命週期中的一些信息:http://msdn.microsoft.com/en-us/library/ms178473.aspx

但是,我還是沒能回答我的問題。

預先感謝您的幫助,未來


我剛纔VS2010下做了一些測試。

這裏是我的項目的主要組成部分的清單:

  • 含指數HTTPGET操作方法的Home控制器。
  • 由Index操作方法產生的視圖。
  • 實現單例設計模式的SingletonTest類。

這裏是SingletonTest類的代碼:

public class SingletonTest 
{ 
    private int counter; 
    private static SingletonTest instance = null; 

    public int Counter 
    { 
     get 
     { 
      return counter; 
     } 
    } 

    public static SingletonTest Instance 
    { 
     get 
     { 
      if (instance == null) 
       instance = new SingletonTest(); 

      return instance; 
     } 
    } 

    private SingletonTest() 
    { 
     counter = 0; 
    } 

    public void IncrementCounter() 
    { 
     counter++; 
    } 
} 

這裏是Index操作方法的代碼:

public ActionResult Index() 
{ 
    SingletonTest st = SingletonTest.Instance; 
    st.IncrementCounter(); 

    return View(); 
} 

這裏是視圖的代碼:

@SingletonTest.Instance.Counter 

這裏我遵循的測試場景是:

  1. IIS服務器已由VS2010自動啓動。
  2. 我已經請求/ Home/Index/URL,然後顯示值1。
  3. 我已經請求了/ Home/Index/URL,然後顯示了值2。
  4. ...

該測試表明,在處理下一個請求時,在步驟1中所做的SingletonTest實例可用。 我想內存空間分配給我的Web服務器上的應用程序。

然後我停止了IIS服務器,並且我再次跟蹤了我的測試場景。 我得到了和以前一樣的結果:1,2,...

+0

測試它創建同一應用程序的多個實例。創建一個內部遞增的單例,並在每次調用時返回一個值。如果您持續獲得相同的價值,那麼不會持續請求。 – Oded 2012-01-11 14:59:17

回答

0

儘管單例可能會持續多個請求,但您需要小心第二次測試的原因 - 當IIS重新啓動或應用程序池被回收一切都將丟失。

你是肯定你需要一個單例實例嗎?

如果您希望在所有請求中保持某種狀態,最好使用外部存儲器,如數據庫。

0

IIS將創建用於處理併發請求的同一應用程序的多實例如何?

我認爲單身的對象不會是相同的,如果IIS在人流量大的情況下