天天看點

web.config的繼承導緻的虛拟目錄釋出問題的解決方案

最近在釋出MVC3站點的時候,釋出了虛拟目錄,出現了web.config的繼承問題,在上找了解決方案,特此記下,留以後備用(以下都沒能解決我遇到的問題):

我遇到的問題:虛拟目錄和主站點的資料庫連接配接字元串名稱一緻,導緻虛拟目錄的站點報錯(錯誤代碼是500),提示資訊就是說名稱為XXX的資料庫連接配接字元串已經存在,這個問題的解決方案就是在<connectionStrings>節點下加入<remove name="XXX" />節點,意思為:移除對父配置檔案的資料庫連接配接字元串的引用;也就是代碼如下:

1 <connectionStrings>
2     <remove name="主站點中的資料庫連接配接字元串名稱" />
3     <add name="XXX" />
4 </connectionStrings>      

微軟官方文檔如下:http://msdn.microsoft.com/zh-cn/library/wkataz2t(v=vs.80).aspx

1 必須在上一層虛拟目錄(如根目錄)所在的Web.config加上 
 2 如:<location path="." allowOverride="false" inheritInChildApplications="false"> </location> 
 3 方法如下: 
 4 程式代碼 
 5 <location path="." allowOverride="false" inheritInChildApplications="false"> 
 6 <system.web> 
 7 <pages maintainScrollPositionOnPostBack="true"> 
 8 </system.web > 
 9 </location> 
10 如此下一層的虛拟目錄就可以達到你要的需求了。
11 
12  
13 
14 下面再轉一篇:
15 
16 =====================================================
17 
18 今天要部署一個網站和一個和網站相關的webservices接口,我把網站部署後,就把WEB接口作為它下面的一個虛拟目錄來處理了,這樣他們可以共享一個域名.他們各個都有一個webconfig配置檔案,部署後發現網站正常,可是WEB接口卻報錯,說配置檔案出了問題,仔細檢查發現WEB接口用的是網站的配置檔案,一下子沒招了.
19 
20 後來在網上一查,發現利用配置檔案的配置節可以讓它不繼承父目錄的配置檔案,如下
21 
22 <location path="." allowOverride="false" inheritInChildApplications="false"> </location>
23 
24 把它加在父目錄的<system.web>節外面即可,測試一下果然如此,甚喜,雖記之以備忘,同時也于大夥共享!
25 
26 下面是更好的一個:
27 
28 虛拟目錄中的web.config繼承了主目錄中的web.config出現問題是由于根目錄中的web.config添加了httphandler、 httpmodule 引起的。
29 解決辦法:将 httphandler httpmodule的聲明添加到location中。
30 如下所示:
31 <location path="." allowOverride="true" inheritInChildApplications="false">
32 <system.web>
33 <httpModules>
34 <add name="UrlRewriteModule"
35 type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
36 </httpModules>
37 </system.web>
38 </location>
39 
40 path 不用說指定的是一個目錄
41 allowOverride 指是否可以将這個重寫
42 inheritInChildApplications 指是否被子級應用程式繼承
43 一、應用身份驗證、但個别目錄或檔案不需要身份驗證
44 最常見的是一個網站的背景需要驗證,而前台是不需要的;一般登入頁面會有驗證碼、而生成驗證碼那個頁面是不需要驗證的、否則驗證圖檔是顯示不出來的。
45 解決方法:
46 <system.web>
47       <!-- 身份驗證 -->
48       <authentication mode="Forms">
49         <forms name=".myForm" loginUrl="login.aspx" timeout="20" protection ="All"/>
50       </authentication>
51       <authorization >
52         <deny users ="?"/>
53       </authorization>
54     </system.web>
55 <!-- 驗證碼 -->
56 <location path ="CheckCode.aspx">
57     <system.web >
58       <authorization >
59         <allow users ="*"/>
60       </authorization>
61     </system.web>
62 </location>使用身份驗證、禁止匿名使用者通路,同時對頁面checkcode.aspx允許所有使用者通路、即不用驗證。
63 
64 二、改寫(不需求)web.config繼承
65 假設IIS中有個站點A、而A站點下面有個虛拟目錄B、此時可以輸入:"ttp://ip址/" 通路到A站點,輸入http://ip位址/B 通路到B網站;而B項目中的web.config首先會繼承A站點的web.config,如果A的config有很多設定如<httpModules>,<page>等,而B項目的config沒有這些設定,項目也沒用到這些設定,但B的程式在運作時确會出錯、原因就是它繼承A的config;這個讓人有點讨厭“我壓根沒用它、怎麼會有錯?且提示出錯的那個檔案是A的config”,可以這樣解決:
66 A項目用到了主題
67 <pages enableEventValidation="false" validateRequest="false" theme="default">B項目不用
68 <pages enableEventValidation="false" validateRequest="false" theme="">讓B的主題為空、否則B運作時提示找不到default主題目;
69 
70 A的設定
71 <httpModules>
72           <add name="SiteCache" type="SiteCache"/>
73         </httpModules>B的設定(不用的項,清除)
74 <httpModules>
75      <clear/>
76 </httpModules>如果A.B都用到
77 <appSettings>
78 <add key="app" value="" />
79 </appSettings>B運作時會提示app已經加載,此時可以
80 <appSettings>
81 <remove name="app" />
82 <add key="app" value="" />
83 </appSettings>或者:
84 <appSettings>
85 <clear />
86 <add key="app" value="" />
87 </appSettings>
88 三、禁止web.config重寫
89 同上面的例子、如果B中的config設定必須與A中的相同,不能重寫,則A的config設定
90     <location path="B" allowOverride="false">
91       <system.web>
92         <httpModules>
93           <add name="SiteCache" type="SiteCache"/>
94         </httpModules>
95       </system.web>
96 </location>此時B的config中<httpModules>設定不能改寫,須和A的設定相同。      

本文轉載自:http://blog.csdn.net/yuxuan0476/article/details/4188490

繼續閱讀