IHttpModule.Init方法被执行多次的原因

发现不少朋友跟我一样,错把IHttpModule.Init拿来当做Application_Start的替代品,在其中做一些应用程序初始化的操作。

但其实IHttpModule.Init和Global.asax中的Application_Start事件性质是不同的,不能直接拿IHttpModule.Init来代替Application_Start做ASP.NET应用程序的初始化过程。也不能简单的拿Init方法被重复调用来断定是ASP.NET程序发生了重启。

原因是IHttpModule.Init在ASP.NET响应请求时有可能被重复调用多次,在实际网站运行过程中更是极有可能发生的。

为什么IHttpModule.Init会被调用多次呢 原因是每个HttpApplication实例同时只能处理一个请求,而ASP.NET是支持一定的并发请求的,所以HttpApplication的实例在不够响应并发请求时会被创建多个来响应不同的请求,而每个HttpApplication实例在被创建后都会创建一组新的HttpModule并调用Init方法。

而Application_Start只会在第一个HttpApplication对象被创建后调用,后续创建的HttpApplication实例不会触发此事件。

我想HttpApplication实例的重用是导致IHttpModule的Init方法用途被误解的一个主要原因,因为平时我们调试程序时都是只有一个请求,基本上不可能发生重复执行HttpModule的Init方法的情况。而在实际网站运行环境下,并发请求是很平常的,如果误用了Init方法,可能会导致程序在实际环境下出奇怪问题。

具体细节可以参考MSDN的《IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述》一文,以下是文章中提供的图片:

时间: 2024-09-14 02:27:33

IHttpModule.Init方法被执行多次的原因的相关文章

SharePoint中如何利用HttpModule的Init方法实现全局初始化

我们知道,HttpRuntime中会对每一个Request创建一个HttpApplication对象(HttpApplicationFactory从一个HttpApplication池来拿).对于Global.asax,当创建第一个HttpApplication对象才会执行的Application_Start方法. 然后每一个HttpApplication对象会创建HttpModule对象,然后只执行一次Init方法.但在实际场景中,HttpRuntime会根据请求次数创建多个HttpAppli

java-strus2中怎么实现servlet中的init()方法

问题描述 strus2中怎么实现servlet中的init()方法 我写了一个serlvet.. 我对init()方法做了实现 ...........为了在servlet第一次被访问的时候做一些事情 ..........并且以后再访问servlet都不会执行init()方法 我现在怎么把这个servlet加到struts2中呢 哎 小白一个 求大神帮忙!!! 解决方案 首选你要明确加servlet时候干嘛的 如果是初始化相关参数可以不用加 可以放在配置相关参数中 如果确实要用servlet放在w

jquery单击事件执行后台方法提前执行的问题

问题描述 jquery单击事件执行后台方法提前执行的问题 我在主页末尾添加javascript代码如下: $(function(){ $(".fouct1:first").click(function(){ var a=<%=ServerIpAdd()%>; //执行一个后台方法 }); }); 可是,每次刷新页面就执行了ServerIpAdd()方法,而不是单击事件后执行ServerIpAdd()方法(记录单击特定链接的次数),请高手提供一个好的方法,实现单击某个链接以后

seo优化的核心是策略方法在于执行

众所周知,seo优化我们知道无外乎就是站内.站外的日常优化,很多时候网站优化笔者认为我们在追求策略的同时一定不要忘了执行这一关键因素,方法再好,策略制定的完美无缺,但是执行力跟不上,我们的优化思想只能付诸东流,作为一个新人,保持一份淡定的心态,网站优化执行力的培养对于新人而言是非常有必要的,下面笔者主要和大家谈谈seo优化的核心是策略方法在于执行,具体的细节问题,好,闲话短续,咱们今天今天主题. 第一,提高自身学习能力也是一种执行力.笔者为什么第一点开门见山的首先谈到学习力,因为网站优化SEO虽

ASP.NET中基类Page_Load方法后执行的原因

加载对应Load事件和OnLoad方法,对于这个事件,相信大多数朋友都会比较熟悉,用VS.Net生成的页面中的Page_Load方法就是响应Load事件的方法,对于每一次请求,Load事件都会触发,Page_Load方法也就会执行,相信这也是大多数人了解ASP.Net的第一步. Page_Load方法响应了Load事件,这个事件是在System.Web.WebControl.Control类中定义的(这个类是Page和所有服务器控件的祖宗),并且在OnLoad方法中被触发. 很多人可能碰到过这样

uiviewcontroller-swift怎么重写父类的init方法

问题描述 swift怎么重写父类的init方法 我想重写UITextFiled的方法,在init(frame)上加一个参数,init(frame:CGRECT,uiviewcontroller:UIViewController)请问如何重写 解决方案 重写是相同方法的不同实现,参数不同方法就不同了,楼主是想重载,如下两个例子可以清晰表现用法和区别: 例如UIView重写父类的init(frame: CGRect)方法: override init(frame: CGRect) { super.i

asp.net继承母版页Page_Load()方法不执行

问题描述 B页面继承了A母版页,画面启动时,B页面的Page_Load()方法不执行了.母版页的Page_Load()执行了.怎么让B页面的Page_Load()也执行 解决方案 解决方案二:引用楼主Mr_Mason的回复: B页面继承了A母版页,画面启动时,B页面的Page_Load()方法不执行了.母版页的Page_Load()执行了.怎么让B页面的Page_Load()也执行 怎么可能解决方案三:你在母版页的page_load里面有没有写其他代码???按道理和理论上他是应该会执行的解决方案

在线程的run方法中执行页面跳转

问题描述 在线程的run方法中执行页面跳转 在做Android程序开发时,想在线程中休眠一段时间之后直接跳转到其他activity中,为什么不能再run方法中直接写. 解决方案 如果 是主线程的话那是肯定不行的直接程序崩溃,开启子线程的话是可以在run()里面写的.你可以用handle.postDlay()这样写,也可以用timeTask.schem()来

Android webView shouldOverrideUrlLoading 方法不执行

问题描述 Android webView shouldOverrideUrlLoading 方法不执行 在android 版本4.4.4以上会执行,测试的4.2.2,4.1.2机器上不会执行: 我要实现的逻辑是点击webview上已经加载好的内容,在shouldOverrideUrlLoading 那里拿到链接地址新开Activity用webview加载,不知道有没有能人异士可以提供解决方案. 解决方案 自己解决了,比较麻烦. 解决方案二: android WebView shouldOverr