system.web下的HttpModules节点和system.webServer下的modules节点的配置区别

自定义web模块,需继承System.Web.IHttpModule接口

一:拦截对该服务器所有的http请求。

第一步:将自定义module类使用强名编译,并放在GAC中。

Windows7不能直接把dll文件拖到GAC中,只能只用GACUtil工具。

方法是:打开Visual Studio命令行,提示进入目录:E:\Program Files\Microsoft Visual Studio 10.0\VC,
gacutil /i [assemblypath],将该Assembly安装在GAC中
gacutil /l [assemblyName], 出现Assembly的详细信息

gacutil /u [assemblyName], 卸载该Assembly

第二步:把模块加在machine.config, web.config或者IIS的applicationhost.config里。
IIS的applicationhost.config位于(%windir%\system32\inetsrv\config\applicationhost.config)

<location path="" overrideMode="Allow">
<system.webServer>
<modules>
    <add name="HttpRequestModule" type="RequestModuleNS.RequestModuleClass,RequestModuleAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=5510eb446e44a3fd"/>
         ......................

其中,type的格式为:“NameSpaceName.ClassName,AssemblyName, StrongName”

二:只拦截对某web程序的Request,有两种方法:

1.将自定义模块单独编译为一个dll文件,并通过dll引用添加到web程序。

并修改该程序内部的web.config文件:

<configuration>    
<system.webServer> <!-- IIS7.0集成模式下 -->
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<add name="HttpRequestModule" type="RequestModuleNS.RequestModuleClass,RequestModuleAssembly"/>
</modules>
</system.webServer>
<system.web> <!-- IIS7.0经典模式或者IIS之前版本 -->
<compilation debug="true" targetFramework="4.0"/>
<httpModules>
<add name="HttpRequestModule" type="RequestModuleNS.RequestModuleClass,RequestModuleAssembly"/>
</httpModules>
</system.web>
</configuration>

2.把自定义模块的类文件放在web网站的app_code目录下,并修改该程序内部的web.config文件:

<configuration>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<add name="HttpRequestModule" type="RequestModuleNS.RequestModuleClass"/>
</modules>
</system.webServer>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpModules>
<add name="HttpRequestModule" type="RequestModuleNS.RequestModuleClass"/>
</httpModules>
</system.web>
</configuration>

其中,type格式为“NameSpaceName.ClassName“。

奇怪的是,在第二种方式下,在VS debug模式下访问.wmv文件时不能触发module,访问.aspx文件时则可以。而第一种方式下,访问程序里的.wmv文件和.aspx文件都可以触发该自定义module。笔者不知为何,索性改回第一种方式。留待以后再探索。(探索结果:原来不是第二种方式的问题,而是在测试时网站端口改变,而旧的debug线程未被杀死,所有用旧的url直接访问了过期的旧线程。这是不是VS的一个bug,当退出debug时,启动的临时线程并未被杀死,而重新启动debug时,旧的临时server线程也未被新的替代,好大一个bug哇。看图:

system.web下的HttpModules节点和system.webServer下的modules节点的配置区别,只有两个,壮观的时候有6,7个呢。

)

 
 
 
上一篇:CSS3/jQuery自己定义弹出窗体


下一篇:C++编写绚丽的界面