以前如果我们有这种需求(根站点和虚拟目录站点全是基于 .net 1.1):
在1.1根站点下,部署一个httpModule ,然后这个根站点下,有个1.1的虚拟目录,而这个虚拟目录不需要加载这个httpModule。 则需要做以下两步才可以达到效果:
1、在虚拟目录的web.config 文件中,卸载 需要的 httpModule.
<system.web>
<httpModules>
<remove name="ErrorLog"/>
</httpModules>
</system.web>
2、把 根目录下要用的 httpModule 组件也同步 Copy 到 虚拟目录下的 bin 目录下。
原因:
web.config 文件加载配置信息时候,要做的其中一部分事情如下:
ASP.net在处理httpModules 配置节时,其中当看到 Add 配置节的时候就立刻检查这个配置节定义的 type 是否存在。
因为虚拟目录的卸载 httpModule 节
是放在次要的 web.config 中的,
所以根节点的主要 web.config 文件
要比 虚拟目录中 web.config(次要文件)
提早被处理。
那么如果在处理
的时候,并没有这个type(没有把dll复制过去或者放GAC),那么ASP.NET就会把找不到类型的异常直接抛出异常。
所以,需要把相关的DLL都要在根节点和虚拟目录都部署一下的。虚拟目录中的web.config 中卸载配置
的作用只是取消加载相关的东西,但是却无法跳过类型检查。
以上内容请参考以下链接:
http://blog.joycode.com/dotey/archive/2004/11/30/40010.aspx
但是, 如果你是在 2.0 的根站点下,部署一个 1.1 的虚拟目录, 问题就来了(1.1的根站点部署2.0的虚拟目录也会有问题):
1、把 一个 2.0 版本的 httpModule 文件 copy 到 1.1 的虚拟目录,会产生以下异常:
分析器错误信息: 文件“*****”的格式无效。
原因:如上 你难道想 1.1 的 .net 加载 2.0 的文件??当然会报文件格式不对了。
2、如果1.1 的虚拟目录下部署的是 1.1版本的 httpModule, 2.0 的根目录部署的是 2.0 版本的 httpModule.
则很可能会产生如下异常:
找到的名为“******”的程序集清单定义与程序集引用不匹配。
原因:你的这个 httpModule组件. 在 2.0 和 1.1 版本的时候,PublicKeyToken 和 Version 等信息可能都变化了。当然不匹配了。
唯一可能解决问题的方法,就是
你的 httpModule 在 1.1 和 2.0 版本的时候,版本号、签名用的 key 文件、类的名称空间、类名等等都必须完全一样。
而这又不能体现版本升级。。。。。。。基本上不太现实。
上面的问题 会是一个非常苦恼的问题,您还不如把整个站点都设置为 1.1 或者都升级为 2.0。千万不要尝试一部分是 1.1,一部分是2.0 。否则你会死的很难看的。