【问题标题】:How Many Times Does an ASP .NET Application StartASP .NET 应用程序启动多少次
【发布时间】:2010-08-19 05:59:07
【问题描述】:

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 集合,你会发现……MVC 路由已经已注册(意味着 RegisterRoutes 必须已被调用)...即使 hasRun 为假!

这是在调试 IIS 网站的 Visual Studio 中运行的某种奇怪现象吗?我知道 IIS 可以在一个 AppDomain 中托管两个 HttpApplications,并且 SomeHttpModule 在同一个 AppDomain 中会被初始化两次……对吗?但是我的静态布尔 hasRun 怎么可能仍然是假的???

谢谢。

【问题讨论】:

  • 您也有在Application_Start 中给RegisterRoutes() 打电话吗?

标签: c# asp.net-mvc


【解决方案1】:

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

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

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

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

【讨论】:

  • 但是为什么 RouteTable.Routes 会持续存在,而不是 hasRun?
  • 由于某种原因,我无法在发布模式下重现此问题...我认为这可能是调试异常...不过我会接受这个答案,以结束问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2011-01-14
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多