自定義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哇。看圖:
,只有兩個,壯觀的時候有6,7個呢。
)
