发现不少朋友跟我一样,错把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实现URL重写》一文的示例代码,如果有未尽之处或者不明白之处请到本人博客上查看,网址是:http://blog.csdn.net/zhoufoxcn/archive/2009/07/14/4346356.aspx
这两个方法之间的任何处理都可以用来执行内容过滤。 实现IHttpModule的步骤如下: 1. **定义类并实现IHttpModule接口**: 创建一个新的C#类,并实现`IHttpModule`接口。需要实现`Init`和`Dispose`两个方法。`Init...
1. **创建模块类**:首先,需要创建一个继承自IHttpModule接口的类,实现Initialize和Dispose方法。Initialize方法用于在应用程序启动时注册事件处理程序,而Dispose方法则在应用程序结束时释放资源。 ```csharp ...
1. **创建一个IHttpModule类**:首先,需要创建一个实现了IHttpModule接口的类,比如`HookModule`,在这个类中实现`Init`和`Dispose`方法。 2. **注册模块**:在Web应用程序的Global.asax文件中,使用`...
`Init`方法在应用程序启动时被调用,用于初始化模块,而`Dispose`方法则用于释放模块占用的资源。 二、IHttpModule工作原理 IHttpModule与ASP.NET的HTTP管道(Pipeline)紧密相关。HTTP管道是一个事件驱动的模型,...
在此接口中,主要关注的方法是` Init `和` Dispose `。 2. **注册模块**:接下来需要在` web.config `文件中注册该模块,以便ASP.NET在启动时加载它。 3. **重写请求**:在HTTP模块的` OnBeginRequest `事件中,...
IHttpModule有两个关键方法:Init(httpApplication)和Dispose()。Init方法在应用程序启动时调用,用于初始化模块,而Dispose()方法在模块不再需要时释放资源。通过IHttpModule,开发者可以在请求开始、结束、身份...
在上述代码中,我们实现了`IHttpModule`接口的方法`Init`和事件处理程序`Application_AuthenticateRequest`。`Init`方法用于注册事件处理器,而`Application_AuthenticateRequest`方法用于处理用户的认证请求。 ###...
在C#中,我们可以通过继承`System.Web.IHttpModule`接口并实现其两个方法——`Init`和`Dispose`来创建一个HttpModule。`Init`方法用于初始化模块,并将我们的处理程序(通常是检查Session和Cookie的逻辑)添加到HTTP...
本文实例讲述了C#使用IHttpModule接口修改http输出的方法。分享给大家供大家参考。具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; //修改http输出先建...
### 获取ASPX页面执行时间完全解决方案 在进行Web应用程序开发时,了解页面的加载和执行时间对于优化用户体验、提升系统性能至关重要。本文将详细介绍一种获取ASPX页面执行时间的完整解决方案,该方案通过自定义...
HttpModule提供了一种扩展Web应用程序功能的方法,它可以在请求生命周期的早期阶段进行干预,执行自定义逻辑,如身份验证、日志记录、缓存控制等。这个“HttpModule实例”可能是一个具体的示例项目,展示了如何创建...
//www.cnblogs.com/jzywh/archive/2005/09/29/246650.html,http://www.cnblogs.com/jzywh/archive/2006/02/20/334004.html)来获取更多关于URLReWriter的详细信息和示例代码。 实施过程中可能会遇到的问题包括但不...
- 创建HttpModule,实现IHttpModule接口,重写BeginRequest方法。 - 分析请求URL,根据预定义的规则进行匹配和重定向。 - 使用Regex类进行正则表达式匹配,以灵活地定义URL模式。 - 使用HttpResponse.Redirect方法...
权限验证 防盗链 ,不用每一页都去做权限验证,只要实现接口就可以了
三、安装方法: 1、将文件www.sunsharer.cn.dll复制到网站bin目录下; 2、将配置好的sqlstr.txt复制到网站bin目录下; 3、将数据库表加入到网站数据库,或者单独建库; 4、配置Web.config文件, 将“<modules ><add...
这个接口虽然看起来非常简单,仅包含几个方法(如`Init`、`Dispose`以及`Context_BeginRequest`和`Context_EndRequest`等),但它却是`HttpModule`机制的基础。通过实现`IHttpModule`接口,开发者能够创建自定义模块...
1. 创建自定义HTTP模块类:继承自`System.Web.IHttpModule`接口,实现`Initialize`和`Dispose`方法,以及你想要拦截请求或响应的方法,如`BeginRequest`、`EndRequest`等。 2. 在`Web.config`配置文件中注册模块:...
- **IHttpModule.Init**:当模块被加载到 ASP.NET 应用程序时调用。 ##### 2. **请求处理阶段** - **HttpApplication.PostResolveRequestCache**:在请求缓存解析之后触发。 - **调用动作过滤器**:通过 `...