2012-01-11 201 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在人流量大的情况下