同一个网站,根站点和虚拟目录站点 ASP.net 版本不一样,存在的一个麻烦问题。

来源:互联网 发布:税务总局电子申报软件 编辑:程序博客网 时间:2024/05/14 11:10

以前如果我们有这种需求(根站点和虚拟目录站点全是基于 .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 。否则你会死的很难看的。

原创粉丝点击