ASP .NET应用程序启动的次数

时间:2010-08-19 05:59:08

标签: c# asp.net-mvc

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中点击“go”时,我的调试器在Run方法的第一行的断点处停止...但是如果我检查RouteTable.Routes集合那么lo和behlold ... MVC路由已经已经注册(意味着必须已经调用RegisterRoutes)...即使hasRun是假的!

这是在Visual Studio调试IIS网站时运行的某种奇怪吗?我知道IIS可以在一个AppDomain中托管两个HttpApplications,并且SomeHttpModule会在同一个AppDomain中获得两次Init'd ......对吗?但是我的静态bool怎么会运行仍然可能是假的???

感谢。

1 个答案:

答案 0 :(得分:1)

Web应用程序可以多次启动。只要IIS认为它没有被使用,就可以关闭应用程序,当下一个请求进入时,应用程序将重新开始。

此外,应用程序可能会设置为每天回收,在这种情况下,它将至少每天启动一次。

我不确定为什么应用程序在调试时会启动两次,但它可能与调试器附加到进程的方式有关。

静态变量不能从应用程序的一个实例存活到下一个实例的原因是它们是单独的实例。当应用程序再次启动时,它会从它自己的变量集开始。它从一个全新的虚拟地址空间开始,因此前一个实例没有任何内容。