none
限制 web.config 的繼承 RRS feed

  • 問題

  • 大家好

    請教諸位先進一個 web.config 繼承的問題,
    由於網站中的子應用程式(虛擬目錄)中的 web.config 會繼承根目錄的 web.config,
    造成兩個 web.confg 的設定衝突 ... 等狀況,
    間接使得子應用程式的系統發生錯誤無法執行。

    小弟知道能夠在 web.config 中的 section 項目中設定繼承關係,
    但是必須一個一個去設定,
    有沒有更簡單的方法,
    能夠直接宣告子應用程式中的 web.config "完全不繼承" 根目錄的 web.config 呢?

    2007年7月20日 上午 07:30

解答

  • Dear  Johnny Fang:

    你必須在上一層虛擬目錄(如根目錄)所在的Web.config加上

    如:<location path="." allowOverride="false" inheritInChildApplications="false"> </location>

    方法如下:

    Code Snippet

    <location path="." allowOverride="false" inheritInChildApplications="false">

    <system.web> 

     <pages maintainScrollPositionOnPostBack="true">

    </system.web >

    </location>

    如此下一層的虛擬目錄就可以達到你要的需求了。

     

     

    2007年7月20日 上午 07:44
  • 不繼承變成每個子目錄可能都要開一個設定,我倒覺得在子目錄用個新的

    web.config

     

    把這個目錄下需要的屬性完全覆寫就好了,畢竟完全不繼承的話,管理上也會比較麻煩。

    2007年7月20日 上午 08:19
    版主

所有回覆

  • Dear  Johnny Fang:

    你必須在上一層虛擬目錄(如根目錄)所在的Web.config加上

    如:<location path="." allowOverride="false" inheritInChildApplications="false"> </location>

    方法如下:

    Code Snippet

    <location path="." allowOverride="false" inheritInChildApplications="false">

    <system.web> 

     <pages maintainScrollPositionOnPostBack="true">

    </system.web >

    </location>

    如此下一層的虛擬目錄就可以達到你要的需求了。

     

     

    2007年7月20日 上午 07:44
  • 不繼承變成每個子目錄可能都要開一個設定,我倒覺得在子目錄用個新的

    web.config

     

    把這個目錄下需要的屬性完全覆寫就好了,畢竟完全不繼承的話,管理上也會比較麻煩。

    2007年7月20日 上午 08:19
    版主
  • 我很贊成璉大的建議,但對於實體子目錄應該還是會繼承上層目錄的,

    只有在比較特殊的情況才需要將他設定成虛擬目錄來另外起一個Web.config,

    像小弟的環境中是多人開發的環境,大部分的開發者均會將自行開發的網站放到主要網站下,

    但主要網站若存在web.config且他設定了如beta版的Altas元件的Tag如

    <add name="ScriptModule" type="Altas.ScriptModule " ......../>

    但新的網站卻是使用正式版的Ajax元件時,便會遇到衝突情況,此時必須便需要設定不繼承,

    才不會發生問題。

    2007年7月20日 上午 08:56
  • 這種情形應該滿少的,畢竟根目錄仍應該是要正式服務才對,當然也不是不可能。

     

    只能說大家的創意十足,還好微軟提供了這樣的彈性。

     

    引用個廣告詞:用心發現,潛能無限。

    加個後語:支援創意,彈性無限。

    2007年7月20日 上午 09:56
    版主
  • 感謝 James 及璉大的回覆

    是這樣的,
    小弟的公司有一共有四個網站,
    四個網站的設定都不怎麼相同,
    小弟是希望在其中一個網站開發新的應用程式的時候,
    不需要特別變更什麼設定,
    就能夠很輕易地將其移植到另外三個網站上使用,
    所以新的應用程式是一個能夠完全獨立的系統,
    只是它看起來是依附在某一個 domain 底下

    James 提到的 AJAX 也是我碰到過的狀況之一,
    我也經常會遇到有其他 RD 同事去修改底層的 web.config 也不講,
    過一會兒就有其它部門打電話來 「Johnny, 你的 XXX 系統又掛了」,
    真的是 ... 會讓人冒青筋、爆血管 ...
    2007年7月23日 上午 01:55
  • Johnny,

    我遇過的情況也跟你類似,所以你可以試看看我的方法,

    這樣就算RD動了你所謂底層的web.config應該也不會影響其他子網站才對。

     

    2007年7月23日 上午 02:01
  • 這應該牽扯到單位的行政管理。

     

    明訂每個架構下,誰有權限去動就比較清楚。畢竟不會把所有的網頁都寫在根目錄下,通常是依功能、依專案建立到不同子目錄,根目錄的 Web.config 根本沒有動的必要,所以就可以限定根目錄的 web.config 必須經過組長以上的主管同意才能改。

     

    崁入的檔案也可以另外設在不同的目錄,然後給定不同的權限,參數設定仍會依照目前目錄去跑。

     

    不過話又說回來,即使行政管理定出來了,還是有人會去隨便動,然後裝傻不承認... 這是人的問題了。

    2007年7月23日 上午 02:03
    版主
  •  James Wu 寫信:

    只有在比較特殊的情況才需要將他設定成虛擬目錄來另外起一個Web.config,

     

    補充:

    即使不是虛擬目錄也可以直接加 web.config 。

    比如說 專案1\權限1 區可以不用設定為虛擬目錄,就塞個 web.config 進去指定代理使用者,只要把這行設定進去,含結構的外標籤大概 5 行即可。

    比如說 專案1\bug 區還沒完成除錯,可以直接塞個 web.config 進去讓錯誤訊息輸出到遠端讓開發者除錯,但不會影響到其他子目錄或根目錄的輸出。

     

    專案1 的根目錄就把必要屬性全部覆寫根目錄的屬性也可以。

     

    不過我沒試過 <add name ...> 這種在 web.config 內加鍵值的覆寫方式,我所有的設定都是抽離 web.config ,另外開個設定檔,這是開發習慣問題,所以我不知道 <add name> 這種會變怎樣就是了。不知道是覆寫還是並存,由標籤 add 來看,應該是並存吧...

     

    我討厭在 web.config 內加入連線字串或是其他變數,除非上面要求,我碰過 ASP.NET 在 IIS 內註冊發生問題時,web.config / dll / aspx / vb 等可以直接被抓到 client (Win2k/XP),就像一般的檔案下載,大家都喜歡放在 web.config 這裡面,所以當網站發生問題時,惡意使用者會優先抓 web.config 這種東西 (Win2003 要自己改 MIME 才能輸出這些檔),來試圖侵入你的資料庫。

     

    此外,web.config 只要一變動,該應用程式就要重啟,所有使用者都被踢出去,一般僅能用在唯讀屬性上,自己用外部設定檔,就沒這個限制,也不需要同時維護兩邊設定,所以我自己偏好不用這類的功能。

    2007年7月23日 上午 02:18
    版主
  • 感謝璉大的指教,謝謝。
    2007年7月23日 上午 05:28
  • 璉大點到一個重點了
    很多專案發生問題都不是技術上的問題
    而是 "人" 的問題
    所以小弟才會想找看看有沒有單純一點
    不要去牽扯到 "人"
    從技術上直接不去繼承根目錄 web.config 的方法

    James 的方法暫解了小弟的燃眉之急 (讚)
    不過最終可能還是讓子網站能夠主動拒絕來自父網站的繼承
    (就是繼不繼承的決定權在子網站, 而不是父網站)
    因為小弟還是會擔心有同事把根目錄的 web.config 改壞了
    大家就等著一起 "挫"

    2007年7月23日 上午 06:23
  • 請問

    我在使用vs2005開發的的專案中

    將web.config加上

    Code Snippet
    <location path="." allowOverride="false" inheritInChildApplications="false">

     

     

    之後

    會一直出現inheritInChildApplications屬性未宣告的警告?

    是不是我有什麼地方設定有問題呢?

    2008年8月14日 上午 08:49