【问题标题】:Why is HttpApplication constructor called several times为什么多次调用HttpApplication构造函数
【发布时间】:2009-06-06 05:47:36
【问题描述】:

有人能解释一下为什么从 HttpApplication 派生的自定义类的构造函数在应用程序启动时会被多次调用吗?

我的代码结构如下:
- 我在 global.asax 中的 Global 类派生自 CustomApp 类。
- CustomApp 类派生自 HttpApplication

Global 类是在启动时创建的,但是当我在构造函数中放置断点时,它会被多次调用!我认为应该只创建一个 Application 类的实例?

我错了吗?

UPD:Web 服务器确实可以创建多个 HttpApplication 实例来处理同时进来的多个请求。当您在 HttpApplication 后代的构造函数中放置断点时,这一点变得尤为明显。来自客户端的多个请求(http 内容、CSS 文件等)将处于未决状态,并且为了为每个请求提供服务,Web 服务器将创建 HttpApp 的新实例。因此,在编写应用程序初始化逻辑时,请注意这一点。

【问题讨论】:

  • 是否可以发布一个显示此行为的缩减代码 sn-p?

标签: asp.net httpapplication


【解决方案1】:

我相信 ASP.NET 运行时可能会为每个应用程序域创建多个 HttpApplication。所以 HttpApplication.Init 和 Ctor 可能会被多次调用。

如果您希望初始化代码只运行一次,您应该使用 Application_Start 事件,每个应用程序只会调用一次。

【讨论】:

  • 是否有一个事件(或类似事件)我可以为 Applcation_Start 挂上,因为我需要将我的 HttpApplication 类放在网站之外?
  • 只需在 Global.asax.cs 中实现一个方法Applcation_Start,它就会在启动时自动连接并调用。 msdn.microsoft.com/en-us/library/ms178473.aspx
  • 但请记住,如果您在 Application_Start() 中注册事件处理程序,则不会触发像 AuthenticateRequestAcquireRequestState 这样的事件。您可能希望在 Init() 中注册它们,这是对 HttpApplication 的覆盖。
【解决方案2】:

请查看global.asax in ASP.NET 的帖子 - 它解释了为什么有多个 HttpApplication 实例。基本上有两个池:特殊池和普通池。普通池包含请求使用的 HttpApplication 实例(每个请求都有自己的 HttpApplication 实例)。特殊池包含用于应用程序级事件(如 Application_Start、Application_Error)的 HttpApplication 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2013-08-25
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    相关资源
    最近更新 更多