从IIS6新增应用程序池的概念,到现在IIS7,对HTTP请求处理功能已经越来越精确化和不断改善,IIS7应用程序池新增了经典模式和集成模式可供选择。
先直接看一个结果,再分析原因。编写一个最简单的网站,和一个最简单的HttpModule。
程序结构如上,第一个ModuleIISTests是一个网站,里面包括aspx和htm文件,default.aspx文件内容为空,a.htm文件内容为aaaaaa,下面一个TestIISModule是一个类库,TModule.cs是继承自IHttpModule的一个自定义的HtppModule,主要代码如下:
public void Init(HttpApplication context)
{
context.BeginRequest +=new EventHandler(context_BeginRequest);
}
public void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
application.Response.Write("test module lawson");
}
然后配置网站的web.config如下:
。。。
<httpModules>
<add name="myModule" type="TestIISModule.TModule,TestIISModule"/>
</httpModules>
</system.web>
注意:这里是在system.web节点下。然后挂接IIS:
我添加了网站MyModule指向刚才程序开发的网站,引用程序池用的.net2.0经典模式,分别访问default.aspx和a.htm:
Default.aspx被module拦截了,输出了文字内容,但a.htm还是保持文件内容不变输出。
现在更改下web.config,首先删除刚才system.web节点下的httpModule节点,配置如下:
<modules>
<add name="myModule" type="TestIISModule.TModule,TestIISModule"/>
</modules>
。。。
</system.webServer>
注意:这里是在system.webServer节点下配置的,IIS集成模式下会读取该大节点下的modules,handlers等节点,然后把应用程序池改为集成模式,再刷新IIS,重新访问如下:
Default.aspx还是被拦截到了,但是这里a.htm也被拦截了。