IHttpModule.Init方法被执行多次的原因
2012-07-02 15:49
363 查看
(http://www.csharpwin.com/dotnetspace/446.shtml)
发现不少朋友跟我一样,错把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 应用程序生命周期概述》一文,以下是文章中提供的图片:
也可以使用Refelector反编译System.Web程序集,分析IHttpModule.Init方法的调用关系,
你最后将找到System.Web.HttpApplicationFactory.GetNormalApplicationInstance方法,其中可以看出来HttpApplication的实例是怎样重用和创建的。
综上所述,IHttpModule.Init是不能简单的作为Application_Start的替代品的。
一个比较简单的办法是用一个静态的bool类型字段作为初始化标记,HttpModule的Init执行过程序所需的初始化后,就将标记设置为true,下次就不再重复初始化。
但是,类似注册BeginRequest事件这样的代码,还是需要每次Init都执行,因为这时候的HttpModule实例是不一样的,如果通过判断静态的初始化标记字段而不重复注册事件的话,会导致类似URL重写有时候有执行有时候没执行的奇怪问题。
发现不少朋友跟我一样,错把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 应用程序生命周期概述》一文,以下是文章中提供的图片:
也可以使用Refelector反编译System.Web程序集,分析IHttpModule.Init方法的调用关系,
你最后将找到System.Web.HttpApplicationFactory.GetNormalApplicationInstance方法,其中可以看出来HttpApplication的实例是怎样重用和创建的。
综上所述,IHttpModule.Init是不能简单的作为Application_Start的替代品的。
一个比较简单的办法是用一个静态的bool类型字段作为初始化标记,HttpModule的Init执行过程序所需的初始化后,就将标记设置为true,下次就不再重复初始化。
但是,类似注册BeginRequest事件这样的代码,还是需要每次Init都执行,因为这时候的HttpModule实例是不一样的,如果通过判断静态的初始化标记字段而不重复注册事件的话,会导致类似URL重写有时候有执行有时候没执行的奇怪问题。
相关文章推荐
- IHttpModule.Init方法被执行多次的原因
- IHttpModule.Init方法被执行多次的原因(转自:http://www.cnblogs.com/mingda/archive/2009/02/11/1388709.html)
- IHttpModule.Init会被调用多次的原因(转自:http://lidup.blog.51cto.com/426277/140338)
- IHttpModule.Init会被调用多次的原因
- 出现 HTTP Status 500 - Servlet.init() for servlet springmvc threw exception 异常的原因及解决方法
- python+selenium执行多个测试方法时,chrome浏览器打开多次原因
- SharePoint利用HttpModule的Init方法实现全局初始化
- SharePoint利用HttpModule的Init方法实现全局初始化
- 调用RadioGroup的check(id)方法,监听onCheckedChanged方法被执行多次;调用clearCheck(),onCheckedChanged方法仍被执行的原因和解决办法
- SpringMVC在启动完成后执行方法 - 执行多次的原因及解决方案
- python+selenium执行多个测试方法时,chrome浏览器打开多次原因
- SharePoint利用HttpModule的Init方法实现全局初始化
- JQuery 给元素绑定click事件多次执行的解决方法
- 服务器出现HTTP400、401、402、403错误原因及解决方法
- 【转】 android-继承BaseAdapter--自定义适配器,getView执行多次的解决方法
- 转载---HttpUrlConnection发送post请求汉字出现乱码的一个解决方法及其原因
- RadioGroup调用check(id)方法时,onCheckedChanged方法被执行多次调用解决办法
- C#HttpClient或使用CookieContainer模拟登陆后HttpRequest不发送cookie的解决方法及原因
- Jquery on方法绑定事件后执行多次
- 异步任务 AsynTask 创建之后可以通过 execute()方法执行多次么?