1

MvcApplication 是 MVC 3 Web 应用程序中的单例吗?为什么我找到了 3 个实例?

我的步骤:(VS2010 SP1 + ASP.NET MVC 3 工具更新)

  1. 创建一个默认的 Internet MVC 3 应用程序(带有帐户示例)
  2. 在 global.asax 中添加 MvcApplication() 构造函数,并在其中设置断点
  3. 按 F5 调试

我发现构造函数被调用了 3 次!

此致,

扎克@Shine

===编辑===

更正:

为 1 个 Web 应用找到 2 个实例,而不是 3 个。经过仔细检查,我发现我的解决方案包含 2 个 Web 应用程序,删除其中一个后,我可以找到左侧应用程序的 2 个实例。

这是日志(数字是 MvcApplication 实例的哈希码)

MvcApplication(): 41516761
Application_Start(): 41516761
 MvcApplication(): 56552081
 Application_AuthenticateRequest(): 56552081
 Application_AuthenticateRequest(): 56552081
 Application_AuthenticateRequest(): 56552081
 MvcApplication_Disposed(): 56552081
Application_End(): 41516761

如图所示,一个实例用于处理开始、结束事件,另一个用于处理请求。

4

1 回答 1

1

MvcApplication 从下面的普通 asp.net 继承自 HttpApplication 是了解 asp.net 管道的一个很好的链接。我已经从文章中复制了相关部分。

简而言之 - 没有 MvcApplication 不是单例的,但每个请求只存在一个。

http://www.west-wind.com/presentations/howaspnetworks/howaspnetworks.asp

每个请求都被路由到一个 HttpApplication 对象。HttpApplicationFactory 类根据应用程序的负载为您的 ASP.NET 应用程序创建一个 HttpApplication 对象池,并为每个传入请求分发引用。池的大小受限于 machine.config 的 ProcessModel Key 中 MaxWorkerThreads 设置的设置,默认为 20。但池以较小的数字开始;通常是一个,然后随着需要处理多个同时请求而增长。池受到监控,因此在负载下它可能会增长到其最大实例数,然后随着负载下降,该实例数会缩小到较小的数量。HttpApplication 是特定 Web 应用程序的外部容器,它映射到 Global.asax 中定义的类。它是您在应用程序中经常看到的 HTTP 运行时的第一个入口点。如果您查看 Global.asax(或类背后的代码),您会发现该类直接派生自 HttpApplication:

于 2012-04-21T02:50:27.870 回答