หลีกเลี่ยงการสืบทอดเว็บ. config ในเว็บแอปพลิเคชันลูกโดยใช้ inheritInChildApplications


153

ฉันกำลังพยายามเพิ่ม

<location inheritInChildApplications="false">

ไปที่เว็บแอปพลิเคชันเว็บหลักของฉัน แต่ดูเหมือนว่าจะใช้งานไม่ได้

พ่อแม่ของฉันweb.configมี:

<configuration>
    <configSections>
    </configSections>

    // 10 or so custom config sections like log4net, hibernate,

    <connectionStrings>
    </connectionStrings>

    <appSettings>
    </appSettings>

    <system.diagnostics>
    </system.diagnostics>

    <system.web>
         <webParts>
         </webParts>
         <membership>
         </membership>

         <compilation>
         </compilation>
    </system.web>

    <location ..>
    <system.web>
        </system.web>
    </location>

    <system.webServer>
    </system.webServer>

เว็บแอปพลิเคชันลูกของฉันตั้งค่าเป็นแอปพลิเคชันใน IIS และกำลังสืบทอดจากพาเรนต์web.configซึ่งเป็นสาเหตุของปัญหา

ฉันควรจะวางตรงไหน

<location inheritInChildApplications="false">

ดังนั้นจะเพิกเฉยต่อการตั้งค่า web.config ต่างๆทั้งหมดหรือไม่

คำตอบ:


203

ในฐานะผู้แสดงความคิดเห็นสำหรับคำตอบก่อนหน้านี้ที่กล่าวถึงคุณไม่สามารถเพิ่มบรรทัด ...

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

... <configuration>เพียงแค่ด้านล่าง คุณต้องปิดส่วน web.config แทนซึ่งคุณต้องการปิดใช้งานการสืบทอด ตัวอย่างเช่น:

<!-- disable inheritance for the connectionStrings section -->
<location path="." inheritInChildApplications="false">
   <connectionStrings>
   </connectionStrings>
</location>

<!-- leave inheritance enabled for appSettings -->
<appSettings>
</appSettings>

<!-- disable inheritance for the system.web section -->
<location path="." inheritInChildApplications="false">
   <system.web>
        <webParts>
        </webParts>
        <membership>
        </membership>

        <compilation>
        </compilation>
      </system.web>
 </location>

แม้ว่า<clear />อาจใช้งานได้สำหรับบางส่วนของการกำหนดค่า แต่ก็มีบางส่วนที่ต้องการ<remove name="...">คำสั่งแทนและบางรายการก็ไม่สนับสนุนเช่นกัน inheritInChildApplications="false"ในสถานการณ์เหล่านี้ก็อาจจะเหมาะสมในการตั้งค่า


11
เป็นไปได้ไหมที่จะทำในทางอื่น? ฉันคิดว่ามันแปลกที่ฉันต้องอัปเดตผู้ปกครองเมื่อเป็นเด็กที่ตัดสินใจว่าควรรับการตั้งค่าหรือไม่
nabeelfarid

@nabeelfarid - ฉันเห็นด้วยอย่างยิ่ง หากคุณมีบล็อก WordPress ในแอปพลิเคชั่น. NET ที่มี web.config ที่ซับซ้อนอาจเป็นปัญหาใหญ่ในการจัดการกับการล้างออกหรือป้องกันการสืบทอด ฉันคิดว่าระบบ 'ตำแหน่ง' ทั้งหมดได้รับการออกแบบให้มีความปลอดภัยมากขึ้นสำหรับโฮสต์ที่ใช้ร่วมกันซึ่งสำหรับปัญหาด้านความเข้ากันได้ที่คนส่วนใหญ่กำลังค้นหาตัวเองที่นี่สำหรับ
Simon_Weaver

มันใช้งานไม่ได้สำหรับฉัน ความคิดใด ๆ ฉันเป็นบริการ wcf ซึ่งมีการกำหนดค่าผู้ปกครองตั้งค่าการเชื่อมต่อฐานข้อมูล SIT ฉันมีโฟลเดอร์อื่นในบริการเดียวกันซึ่งระบุว่า "QA" และมีไฟล์บริการ WCF เดียวกันใน SIT รวมถึง web.config แต่ชี้ฐานข้อมูลไปยัง QA เมื่อฉันเรียกใช้บริการ wcf ภายในโฟลเดอร์ "QA" จะใช้การเชื่อมต่อจากการตั้งค่าหลักเท่านั้น (แม้ฉันจะให้แท็ก <location>) โปรดแจ้งให้เราทราบว่าปัญหาคืออะไร
superachu

@NickCecil ฉันจะทำสิ่งนี้ใน IIS 6 ได้อย่างไร inheritInChildApplicationsไม่ได้รับการยอมรับว่าเป็นพารามิเตอร์ที่ถูกต้องสำหรับ<location />องค์ประกอบ เว็บไซต์ของฉันใช้งาน SharePoint (2007) ฉันสร้างแอปพลิเคชันในไดเรกทอรีเสมือนภายใต้เว็บไซต์นี้จัดการโดยกลุ่มแอปพลิเคชันของตัวเอง แต่ฉันกำลังเผชิญหน้ากับความขัดแย้งระหว่างการกำหนดค่าของ SharePoint และแอปพลิเคชันนี้ ดูคำถามนี้ที่ฉันโพสต์ใน Server Fault
ผู้ใช้เว็บ

1
แอปพลิเคชันของฉันที่ฉันสร้างขึ้นเป็นลูกของเว็บไซต์ยังต้องการโหลด DLLs จากเว็บไซต์แม่ เห็นได้ชัดว่าฉันไม่สามารถใช้<location>สำหรับรันไทม์ ...
ฟรานซิสชาร์ม

65

จำเป็นต้องไปที่<configuration>โหนดรากโดยตรงและคุณต้องตั้งค่าพา ธ ดังนี้:

<?xml version="1.0"?>
<configuration>
    <location path="." inheritInChildApplications="false"> 
        <!-- Stuff that shouldn't be inherited goes in here -->
    </location>
</configuration>

วิธีที่ดีกว่าในการจัดการการสืบทอดการกำหนดค่าคือการใช้การกำหนดค่า<clear/>ลูกในทุกที่ที่คุณไม่ต้องการรับช่วง ดังนั้นหากคุณไม่ต้องการรับค่าสตริงการเชื่อมต่อของพาเรนต์คุณจะต้องทำสิ่งนี้:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>

17
ฉันได้รับข้อผิดพลาดนี้ "ส่วนการกำหนดค่า 'configSections' ไม่สามารถอ่านได้เนื่องจากไม่มีการประกาศส่วน" ในไฟล์ web.config ของผู้ปกครอง
Blankman

คุณสามารถโพสต์การกำหนดค่าด้วยองค์ประกอบ <location> ในนั้นได้หรือไม่ ฉันจะตรวจสอบการแก้ไขของฉันและดูว่า <clear /> อาจเป็นวิธีที่ดีกว่าสำหรับสิ่งที่คุณพยายามทำหรือไม่
Andrew Hare

6
มันไม่ทำงานเมื่อคุณวางไว้ใต้ <configuration> คุณสามารถสรุปได้ว่า <system.web> node แต่คุณไม่สามารถใส่มันเข้าไปในรูทได้
PositiveGuy

หากคุณวางไว้ภายใต้ <configuration> เป็นโหนดที่ 2 คุณจะได้รับ "inheritInChildApplications ดังนั้นจึงไม่ใช่แอตทริบิวต์ที่ถูกต้องในระดับนั้นใน web.config ดังนั้นคุณจะบอกว่าวิธีนี้ใช้งานได้อย่างไร
PositiveGuy

12
-1: ฉันยังสามารถยืนยันได้ว่าการใช้องค์ประกอบตำแหน่งตามที่แสดงด้านบนไม่ทำงาน
Adrian Grigore

23

ฉันใส่ทุกอย่างลงใน:

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

ยกเว้น<configSections/>, และ<connectionStrings/><runtime/>

มีบางกรณีที่เราไม่ต้องการรับช่วงเวลาบางช่วง<configSections />แต่เราไม่สามารถใส่<section/>แท็กได้<location/>ดังนั้นเราจึงต้องสร้าง<secionGroup />และนำส่วนที่ไม่ต้องการของเราไปไว้ในกลุ่มนั้น กลุ่มส่วนสามารถแทรกภายหลังในแท็กสถานที่

ดังนั้นเราต้องเปลี่ยนสิ่งนี้:

<configSections>
  <section name="unwantedSection" />
</configSections>

เป็น:

<configSections>
  <sectionGroup name="myNotInheritedSections">
    <section name="unwantedSection" />
  </sectionGroup>
</configSections>

<location path="." inheritInChildApplications="false">
    <myNotInheritedSections>
        <unwantedSection />
    </myNotInheritedSections>
</location>

ฉันมีส่วนที่กำหนดเอง
Kiquenet

นี่เป็นการแก้ไขปัญหาของฉัน ฉันมีเว็บแอพที่มี EF6.1.3 และเว็บแอปสำหรับเด็กที่มี EF5 การอัปเกรดแอปพลิเคชันเว็บสำหรับเด็กไม่เป็นไปตามคำถามดังนั้นฉันจึงต้องใช้เทคนิคนี้ในการทำให้ทั้งสองทำงานได้ ฉันทำตามตัวอย่างนี้เปลี่ยนmyNotInheritedSectionsเป็นef6PrivateและunwantedSectionเป็นentityFrameworkส่วน
Mohamed Nuur

คุณช่วยได้ไหมว่าทำไมฉันถึงไม่ทำงานนี่คือรหัสของฉัน <configSections> <sectionGroup name="ef6Private"> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </sectionGroup> </configSections> <location path="." inheritInChildApplications="false"> <ef6Private> <entityFramework /> </ef6Private> </location>
asteriskdothmg

9

เราได้รับข้อผิดพลาดเกี่ยวกับสิ่งนี้หลังจากปล่อยรหัสล่าสุดไปยังหนึ่งในสภาพแวดล้อมการพัฒนาของเรา เรามีแอปพลิเคชันที่เป็นลูกของแอปพลิเคชันอื่น ความสัมพันธ์นี้ใช้ได้ดีสำหรับปีจนกระทั่งเมื่อวาน

ปัญหา:
เราได้รับข้อผิดพลาดในการติดตามสแต็กสีเหลืองเนื่องจากมีการป้อนคีย์ซ้ำ นี่เป็นเพราะทั้ง web.config สำหรับแอปพลิเคชันสำหรับเด็กและผู้ปกครองมีคีย์นี้ แต่สิ่งนี้มีอยู่เป็นเวลาหลายปีเช่นนี้โดยไม่มีการเปลี่ยนแปลง ทำไมจู่ๆมันถึงเป็นปัญหาในตอนนี้ล่ะ?

วิธีแก้ปัญหา:
เหตุผลที่ไม่เคยมีปัญหาเพราะกุญแจและค่าต่างกันเสมอ เมื่อวานนี้เราอัปเดตสตริงการเชื่อมต่อ SQL ของเราเพื่อรวมชื่อแอปพลิเคชันในสตริงการเชื่อมต่อ สิ่งนี้ทำให้สตริงไม่ซ้ำกันและในทันทีก็เริ่มล้มเหลว

โดยไม่ต้องทำการวิจัยใด ๆ เกี่ยวกับเหตุผลที่แน่นอนสำหรับเรื่องนี้ฉันต้องสมมติว่าเมื่อแอปพลิเคชันลูกสืบทอดค่าของผู้ปกครอง web.config มันจะไม่สนใจคู่คีย์ / ค่าที่เหมือนกัน

เราสามารถแก้ไขได้โดยการตัดสตริงการเชื่อมต่อเช่นนี้

    <location path="." inheritInChildApplications="false">
        <connectionStrings>
            <!-- Updated connection strings go here -->
        </connectionStrings>
    </location>

แก้ไข:ฉันลืมที่จะพูดถึงว่าฉันเพิ่มสิ่งนี้ใน PARENTS web.config ฉันไม่ต้องแก้ไข web.config ของเด็ก

ขอบคุณสำหรับความช่วยเหลือจากทุก ๆ คนในเรื่องนี้บันทึกก้นของเรา


6

หาก (ตามที่ฉันเข้าใจ) คุณกำลังพยายามปิดกั้นการสืบทอดในการกำหนดค่าเว็บของแอปพลิเคชันลูกของคุณอย่างสมบูรณ์ฉันขอแนะนำให้คุณหลีกเลี่ยงการใช้แท็กใน web.config สร้าง apppool ใหม่แทนและแก้ไขไฟล์ applicationHost.config (อยู่ใน% WINDIR% \ System32 \ inetsrv \ Config และ% WINDIR% \ SysWOW64 \ inetsrv \ config) คุณเพียงแค่ต้องค้นหารายการสำหรับ apppool ของคุณและเพิ่มคุณสมบัติenableConfigurationOverride="false"เช่นในตัวอย่างต่อไปนี้:

<add name="MyAppPool" autoStart="true" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" enableConfigurationOverride="false">
    <processModel identityType="NetworkService" />
</add>

สิ่งนี้จะหลีกเลี่ยงการสืบทอดการกำหนดค่าในแอปพลิเคชันที่ให้บริการโดย MyAppPool

มัตเตโอ


1
MSDN พูดว่า 'เมื่อเท็จการตั้งค่าทั้งหมดในไฟล์ Web.config จะถูกละเว้นสำหรับกลุ่มแอปพลิเคชันนี้' และดูเหมือนจะไม่เหมือนกับสิ่งที่คุณคิดว่ามันหมายถึง ฉันชอบที่นี้จะเป็นคำตอบที่ถูก แต่ผมก็ไม่สามารถที่จะได้รับมัน work.It เกือบดูเหมือนว่าผมชอบการตั้งค่านี้หมายถึง 'สมบูรณ์ไม่อนุญาตให้ web.config ท้องถิ่นสำหรับ AppPool นี้
Simon_Weaver

ดังนั้นโดยทั่วไปแอปพลิเคชันภายใต้กลุ่มแอพนี้ควรจะทำงานโดยไม่มีไฟล์ web.config ใช่ไหม ฉันเข้าใจว่า "ละเว้น web.config" เป็นหนึ่งในโฟลเดอร์รูท ฉันใช้มันสำเร็จสองสามครั้ง ตรวจสอบให้แน่ใจว่าแอปพลิเคชันลูกไม่ได้ขึ้นอยู่กับการกำหนดค่าในรูท web.config (ลองเรียกใช้แอพย่อยในโฟลเดอร์รูทแยกต่างหาก)
Matteo Sganzetta

1
คุณสามารถตรวจสอบวิธีที่ # 2 ในหน้านี้ได้แม้ว่าฉันจะยังไม่ได้ทดสอบเลยiislogs.com/steveschofield/2009/09/20//
Matteo Sganzetta

แอปพลิเคชันลูกของฉันเป็นสำเนาจริงของแอปพลิเคชันหลัก ฉันต้องการใส่/previewเพื่อให้ผู้คนสามารถทดสอบเวอร์ชันใหม่ก่อนที่จะเผยแพร่ ทุกคนแนะนำให้<location>แก้ไขปัญหานี้อยู่เสมอดังนั้นฉันจึงรู้สึกตื่นเต้นมากที่ได้อ่านโพสต์ของคุณ อย่างไรก็ตามมันบ่นThe entry 'default' has already been added.สำหรับรายการการกำหนดค่าที่เกี่ยวข้องกับ AppFabric แม้ว่าฉันจะใช้enableConfigurationOverride="false"
Simon_Weaver

ถ้าฉันตั้งค่าenableConfigurationOverride="false"ในแอปพลิเคชันรูทของฉันมันจะฆ่าแอปพลิเคชันรากอย่างสมบูรณ์และมันจะไม่ทำงาน :-(
Simon_Weaver


1

เราได้รับข้อผิดพลาดเกี่ยวกับคำสั่งกำหนดค่าที่ซ้ำกันในหนึ่งในแอพของเรา หลังจากตรวจสอบดูเหมือนว่าเป็นเพราะปัญหานี้

กล่าวโดยย่อเว็บไซต์รูตของเราคือ ASP.NET 3.5 (ซึ่งคือ 2.0 พร้อมกับไลบรารีเฉพาะ) และเรามีการใช้งานย่อยนั่นคือ ASP.NET 4.0

การสืบทอดทางเว็บ web.config ทำให้แอปพลิเคชันย่อย ASP.NET 4.0 สามารถสืบทอดไฟล์ web.config ของแอปพลิเคชัน ASP.NET 3.5

อย่างไรก็ตาม web.config แอปพลิเคชัน ASP.NET 4.0 ทั่วโลก (หรือ "root") ซึ่งอยู่ที่ C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config และ C: \ Windows \ Microsoft NET \ Framework64 \ v4.0.30319 \ Config \ web.config (ขึ้นอยู่กับพยานของคุณ) มีส่วนกำหนดค่าเหล่านี้อยู่แล้ว

จากนั้นแอพ ASP.NET 4.0 จะพยายามผสานเข้าด้วยกันรูท ASP.NET 4.0 web.config และพาเรนต์ web.config (แอปสำหรับแอป ASP.NET 3.5) และทำงานซ้ำกันในโหนด

ทางออกเดียวที่ฉันสามารถค้นหาได้คือการลบส่วนกำหนดค่าออกจาก parent web.config จากนั้น

  1. ตรวจสอบว่าคุณไม่ต้องการใช้ในแอปพลิเคชันรูทของคุณหรือหากคุณต้องการ
  2. อัปเกรดแอปหลักเป็น ASP.NET 4.0 (เพื่อให้สามารถเข้าถึง configSections ของรูท web.config ได้)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.