加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 高级:HttpModule Init()方法在应用程序的生命中被调

发布时间:2020-12-15 19:01:40 所属栏目:asp.Net 来源:网络整理
导读:Web应用程序初始化如下: 我们知道当IIS收到特定Asp.net应用程序资源的第一个请求时,IIS会创建一个HttpApplication的实例(在global.asax codebehind中定义)。 当创建这个新实例时,它的初始化也会检查所有已配置的HTTP模块。 所有模块然后被实例化并放入应
Web应用程序初始化如下:

>我们知道当IIS收到特定Asp.net应用程序资源的第一个请求时,IIS会创建一个HttpApplication的实例(在global.asax codebehind中定义)。
>当创建这个新实例时,它的初始化也会检查所有已配置的HTTP模块。
>所有模块然后被实例化并放入应用程序的Modules集合(类型为HttpModuleCollection)
>模块循环并调用它们的Init()方法(当它们注册请求事件时)

根据我的理解,上述情况发生在Web应用程序启动/初始化时(因此应用程序启动事件)。

模块会发生什么?

当Web应用程序处于活动状态时,每个请求上的每个请求(重新)是否是基于每个请求的?由于我理解IIS和Asp.net,它们在Web应用程序的整个生命周期中被重用。

如果它们被重用,我们可以假设他们的Init()方法实际上是应用程序启动事件的伪事件处理程序?事情是我们不能附加到http模块中的应用程序级事件。但是如果他们被重用,我们可以使用Init()作为应用程序启动事件,并做任何我们将放在global.asax。

我们可以假定模块的Init()方法只在应用程序启动事件上调用吗?我们可以使用这个假设,即为global.asax codebehind我们不能改变的应用程序注册路由? web.config通常是可访问的,我们可以按照我们想要的方式更改它。
这将实际工作吗?

附加信息

我们可以检查HttpApplication代码并检查其InitModulesCommon()方法。这实际上调用每个注册的HTTP模块的Init()。更有趣的是,此方法仅由InitIntegratedModules()和InitModules()方法使用。它们都只在HttpApplication.InitInternal()方法中使用。这是我的假设的基础,但我想知道是否有人滥用IHttpModule.Init()应用程序启动事件。

解决方法

Init()只被调用一次(每个HttpApplication实例)

在我测试了这个IHttpModule初始化的内部工作如下:

>每个IHttpModule在web应用程序启动时通过instatiating和一个Init()方法的调用来初始化
> HttpApplication在其Modules属性中存储所有模块实例
>模块然后在HttpApplication的整个生命周期中重用,并且只要应用程序存活,就不会丢弃/重新初始化

所以最好的结果是

您不能将IHttpModule附加到应用程序级事件,但可以使用其Init()方法作为伪应用程序启动事件委托。在它里面,你可以执行任何你通常放在Global.asax中Application_Start代理中的代码。

你也可以在我的blog post中阅读关于它的详细信息。

但在现实生活的Web服务器环境中要小心

但IIS使用的东西叫应用程序池。并且每个池可以有任意数量的HttpApplication实例。是多重。应用程序启动创建所有这些实例。每一个都初始化自己的模块列表,但只有第一个执行Application_OnStart事件处理程序。

所以每当你的模块修改一些共同的共享资源,你应该采取额外的措施,以指示第一个模块已经这样做,其他人不会再做。阅读一个additional blog post,它将告诉你如何和何时使用线程锁定与你的模块,使其实际上充当一个Application_OnStart事件处理程序。 BTW:如果需要,还可以处理Application_OnEnd事件。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读