【发布时间】:2010-07-30 11:02:10
【问题描述】:
Web应用初始化如下:
- 我们知道,当 IIS 收到对特定 Asp.net 应用程序资源的第一个请求时,IIS 会创建一个
HttpApplication的实例(在global.asax代码隐藏中定义)。 - 创建此新实例时,会进行初始化,同时检查所有已配置的 HTTP 模块。
- 然后实例化所有模块并放入应用程序的
Modules集合(HttpModuleCollection类型) - 模块循环并调用它们的
Init()方法(当它们注册请求事件时)
据我了解,上述情况发生在 Web 应用程序启动/初始化时(因此是应用程序启动事件)。
模块会发生什么?
当 Web 应用程序处于活动状态时,它们是在每个请求上(重新)启用还是在每个连续请求上从 Modules 属性中重复使用?据我了解,IIS 和 Asp.net 在 Web 应用程序的整个生命周期中都会重复使用它们。
如果它们被重用,我们是否可以假设它们的Init() 方法实际上是应用程序启动事件的伪事件处理程序?问题是我们不能附加到 http 模块中的应用程序级事件。但如果它们被重用,我们可以使用 Init() 作为应用程序启动事件,并执行我们在 global.asax 中放入的任何操作。
问题
我们可以假设模块的Init() 方法在应用程序启动事件中仅被调用吗?我们是否可以使用这个假设来为我们无法更改 global.asax 代码隐藏的应用程序注册路由? web.config 通常是可访问的,我们可以按照我们想要的方式对其进行更改。
这真的有效吗?
其他信息
我们可以检查HttpApplication 代码并检查其InitModulesCommon() 方法。这个实际上调用了每个已注册 HTTP 模块的Init()。更有趣的是,这个方法只被InitIntegratedModules()和InitModules()方法使用。在HttpApplication.InitInternal() 方法中,它们都仅使用。这是我假设的基础,但我想知道是否有人滥用IHttpModule.Init() 进行应用程序启动事件。
【问题讨论】:
标签: asp.net events httpmodule