昨天需要新建一個虛擬目錄放在以前的一個站點下,新建了應用池,配好了環境置頂路徑,虛擬目錄頁建立成功 ,但是程序一直是報錯。這個程序我在測試服務器上是測過的,新建了一個站點是可以正常訪問的,排除了程序問題。
一直是報500,在webconfig配置拋出錯誤的 customErrors節點也不起作用,后來把程序全部刪掉放了一個靜態頁,是可以訪問成功的,說明虛擬目錄的配置也是沒問題的,毫無頭緒,在網上查了好久各種配置都試過了還是不行,今天無意中看見了一個帖子給我靈感,然后試了一下果然成功了
虛擬目錄的webconfig是繼承了根目錄的webconfig的所有配置的,所以如果有節點名稱是一樣的話就會有沖突報錯。這時候很可能會出 http 500的錯誤
這個時候有兩種方法可以解決
1.在根目錄解除子目錄的繼承
1 <configuration> 2 <!--...其他配置...--> 3 <location path="." inheritInChildApplications="false"> 4 <system.web> 5 6 </system.web> 7 </location> 8 <!--...其他配置...--> 9 </configuration>
這里的inheritInChildApplications就是接觸子目錄webconfig的繼承,將不需要子目錄繼承的節點放在這個節點里面就ok了
這種方法的優點是很簡單,但是不夠靈活,同時面對較復雜的Web.config配置,仍可能會報錯。比如根目錄和子目錄有着不同的system.webServer配置,按照這個方法在根目錄的system.webServer外面加上了location限制,不幸的是,IIS7下會出現500錯誤。
2.在子目錄對沖突的節點處理
根目錄節點
1 <connectionStrings> 2 <add name="DBConnectionString" connectionString="Data Source=.;Initial Catalog=test;User ID=sa;Password=sa123" providerName="System.Data.SqlClient"/> 3 </connectionStrings>
子目錄節點
1 <connectionStrings> 2 <clear/> 3 <add name="DBConnectionString" connectionString="Data Source=.;Initial Catalog=test;User ID=sa;Password=sa123" providerName="System.Data.SqlClient"/> 4 </connectionStrings>
在沖突的節點前先clear,清除之前的配置,然后再加載下面的配置就可以了,除了clear 還有remove也可以
<connectionStrings> <remove name="DBConnectionString"/> <add name="DBConnectionString" connectionString="Data Source=.;Initial Catalog=test;User ID=sa;Password=sa123" providerName="System.Data.SqlClient"/> </connectionStrings>
這種配置方法可以用在所有的節點上,使用起來也比較靈活,個人推薦用第二種方法。
參考來自 http://blog.csdn.net/papalian/article/details/7204248 就是我看的那篇帖子,介紹的更為詳細一些
最后說一下,昨天從下午三點到晚上十點,今天上午又弄了一個小時。希望大家可以用得上,以后出現同樣的問題直接就可以用了,大家也要多分享