同一個網站,根站點和虛擬目錄站點 ASP.net 版本不一樣,存在的一個麻煩問題。

以前如果我們有這種需求(根站點和虛擬目錄站點全是基於 .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 。否則你會死的很難看的。

發佈了10 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章