Tránh kế thừa web.config trong ứng dụng web con bằng cách sử dụng inheritInChildAppluggest


153

Tôi đang cố gắng thêm

<location inheritInChildApplications="false">

vào web.config ứng dụng web của cha mẹ tôi nhưng có vẻ như nó không hoạt động.

Cha mẹ tôi web.configcó:

<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>

Ứng dụng web con tôi được thiết lập dưới dạng một ứng dụng trong IIS và kế thừa từ cha mẹ web.configđang gây ra sự cố.

Tôi nên đặt chính xác ở đâu

<location inheritInChildApplications="false">

vì vậy nó bỏ qua tất cả các cài đặt web.config khác nhau?

Câu trả lời:


203

Như những người bình luận cho câu trả lời trước đã đề cập, bạn không thể chỉ cần thêm dòng ...

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

... Ngay bên dưới <configuration>. Thay vào đó, bạn cần phải bọc các phần web.config riêng mà bạn muốn tắt tính kế thừa. Ví dụ:

<!-- 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>

Mặc dù <clear />có thể hoạt động đối với một số phần cấu hình, nhưng có một số phần thay vì yêu cầu <remove name="...">chỉ thị và những phần khác dường như không hỗ trợ. Trong những tình huống này, nó có lẽ thích hợp để thiết lập inheritInChildApplications="false".


11
Có thể làm điều đó theo cách khác? Tôi thấy lạ là tôi phải cập nhật cho cha mẹ, khi đó là đứa trẻ quyết định xem các cài đặt có nên được kế thừa hay không.
nabeelfarid

@nabeelfarid - Tôi hoàn toàn đồng ý. Nếu bạn có một blog wordpress bên trong một ứng dụng .NET với một web.config phức tạp thì đó có thể là một nỗi đau rất lớn đối với việc xóa nó hoặc ngăn chặn sự kế thừa. Tôi nghĩ rằng toàn bộ hệ thống 'vị trí' được thiết kế nhiều hơn về bảo mật cho các máy chủ được chia sẻ mà đối với các vấn đề tương thích, hầu hết mọi người đều tìm thấy ở đây
Simon_Weaver

Điều này không làm việc cho tôi? Có suy nghĩ gì không? Tôi có một dịch vụ wcf có cấu hình cha được đặt thành kết nối cơ sở dữ liệu SIT. Tôi có một thư mục khác trong cùng dịch vụ có nội dung "QA" và nó chứa các tệp dịch vụ WCF tương tự như trong SIT bao gồm web.config nhưng trỏ cơ sở dữ liệu vào QA. Khi tôi gọi dịch vụ wcf bên trong thư mục "QA", nó chỉ nhận kết nối từ cấu hình chính (ngay cả khi tôi cung cấp thẻ <location>). Xin vui lòng cho tôi biết những gì sẽ là vấn đề.
superachu

@NickCecil làm cách nào để đạt được điều này trong IIS 6? inheritInChildApplicationskhông được chấp nhận là tham số hợp lệ cho thành <location />phần. Trang web của tôi đang chạy SharePoint (2007). Tôi đã tạo một ứng dụng trong một thư mục ảo trong trang web này, được quản lý bởi nhóm ứng dụng riêng của nó. Tuy nhiên, tôi gặp phải xung đột giữa cấu hình của SharePoint và ứng dụng này. Xem câu hỏi này tôi đã đăng trong Server Fault.
Người dùng web

1
Ứng dụng của tôi mà tôi đã tạo khi còn là một đứa trẻ của một trang web vẫn muốn tải DLL từ trang web mẹ. Rõ ràng, tôi không thể sử dụng <location>cho thời gian chạy ...
Francis Ducharme

65

Nó cần phải đi trực tiếp dưới <configuration>nút gốc và bạn cần đặt một đường dẫn như thế này:

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

Cách tốt hơn để xử lý kế thừa cấu hình là sử dụng <clear/>cấu hình con trong bất kỳ nơi nào bạn không muốn kế thừa. Vì vậy, nếu bạn không muốn kế thừa chuỗi kết nối của cấu hình cha, bạn sẽ làm một cái gì đó như thế này:

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

17
Tôi gặp lỗi này "Không thể đọc được phần cấu hình 'configSections' vì nó thiếu phần khai báo phần" trong tệp web.config của cha mẹ tôi.
Blankman

Bạn có thể đăng cấu hình của mình với phần tử <location> trong đó không? Tôi cũng sẽ kiểm tra chỉnh sửa của mình và xem liệu <Clear /> có thể là cách tiếp cận tốt hơn cho những gì bạn đang cố gắng thực hiện hay không.
Andrew Hare

6
nó không hoạt động khi bạn đặt nó ngay dưới <configure>. Bạn có thể gói cho phép nói nút <system.web> nhưng bạn không thể đặt nó vào thư mục gốc như thế này.
positiveGuy

Nếu bạn đặt nó dưới <configure> làm nút thứ 2, bạn sẽ nhận được thuộc tính "inheritInChildAppluggest không được khai báo". Vì vậy, nó không phải là một thuộc tính hợp lệ ở cấp độ đó trong web.config. Vì vậy, làm thế nào bạn có thể nói điều này làm việc?
positiveGuy

12
-1: Tôi cũng có thể xác nhận rằng sử dụng phần tử vị trí như được hiển thị ở trên KHÔNG hoạt động.
Adrian Grigore

23

Tôi đặt mọi thứ vào:

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

ngoại trừ: <configSections/>, <connectionStrings/><runtime/>.

Có một số trường hợp khi chúng tôi không muốn thừa kế một số phần từ đó <configSections />, nhưng chúng tôi không thể đặt <section/>thẻ vào <location/>, vì vậy chúng tôi phải tạo <secionGroup />và đưa các phần không mong muốn của mình vào nhóm đó. Các nhóm phần sau đó có thể được chèn vào thẻ vị trí.

Vì vậy, chúng ta phải thay đổi điều này:

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

Vào:

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

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

Tôi có các phần tùy chỉnh
Kiquenet

Điều này đã giải quyết vấn đề của tôi. Tôi đã có một ứng dụng web với EF6.1.3 và ứng dụng web trẻ em với EF5. Nâng cấp ứng dụng web trẻ em là không cần thiết, vì vậy tôi đã phải sử dụng kỹ thuật này để làm cho cả hai hoạt động và nó hoạt động. Tôi đã làm theo ví dụ này, thay đổi myNotInheritedSectionsthành ef6PrivateunwantedSectionentityFrameworkphần.
Mohamed Nuur

Bạn có thể giúp tại sao của tôi không hoạt động, đây là mã của tôi <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

Chúng tôi đã nhận được một lỗi liên quan đến điều này sau khi phát hành mã gần đây cho một trong những môi trường phát triển của chúng tôi. Chúng tôi có một ứng dụng là con của một ứng dụng khác. Mối quan hệ này đã hoạt động tốt trong NĂM cho đến ngày hôm qua.

Vấn đề:
Chúng tôi đã nhận được một lỗi theo dõi ngăn xếp màu vàng do các khóa trùng lặp được nhập vào. Điều này là do cả web.config cho các ứng dụng con và cha mẹ đều có khóa này. Nhưng điều này tồn tại trong nhiều năm như thế này mà không thay đổi. Tại sao đột nhiên nó là một vấn đề bây giờ?

Giải pháp:
Lý do điều này không bao giờ là vấn đề là vì các khóa VÀ giá trị luôn giống nhau. Hôm qua chúng tôi đã cập nhật các chuỗi kết nối SQL của mình để đưa Tên ứng dụng vào chuỗi kết nối. Điều này làm cho chuỗi duy nhất và tất cả đột nhiên bắt đầu thất bại.

Không thực hiện bất kỳ nghiên cứu nào về lý do chính xác cho việc này, tôi phải giả định rằng khi ứng dụng con kế thừa các giá trị web.config của cha mẹ, nó sẽ bỏ qua các cặp khóa / giá trị giống hệt nhau.

Chúng tôi đã có thể giải quyết nó bằng cách gói chuỗi kết nối như thế này

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

Chỉnh sửa: Tôi quên đề cập rằng tôi đã thêm phần này trong web PARAM. Tôi đã không phải sửa đổi web.config của trẻ em.

Cảm ơn mọi người đã giúp đỡ về điều này, đã cứu lấy butts của chúng tôi.


6

Nếu (theo tôi hiểu) bạn đang cố gắng chặn hoàn toàn tính kế thừa trong cấu hình web của ứng dụng con của bạn, tôi khuyên bạn nên tránh sử dụng thẻ trong web.config. Thay vào đó, hãy tạo một apppool mới và chỉnh sửa tệp applicationhost.config (nằm trong% WINDIR% \ System32 \ inetsrv \ Config và% WINDIR% \ SysWOW64 \ inetsrv \ config). Bạn chỉ cần tìm mục nhập cho apppool của bạn và thêm thuộc tính enableConfigurationOverride="false"như trong ví dụ sau:

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

Điều này sẽ tránh kế thừa cấu hình trong các ứng dụng được phục vụ bởi MyAppPool.

Matteo


1
MSDN nói 'Khi sai, tất cả các cài đặt trong tệp Web.config sẽ bị bỏ qua cho nhóm ứng dụng này' và điều đó dường như không giống như những gì bạn nghĩ. Tôi muốn tình yêu này là câu trả lời đúng nhưng tôi chỉ không thể làm cho nó gần như work.It vẻ với tôi như thiết lập này có nghĩa là 'hoàn toàn không cho phép một web.config địa phương cho AppPool này'
Simon_Weaver

Vì vậy, về cơ bản các ứng dụng trong nhóm ứng dụng này được cho là hoạt động mà không có tệp web.config? Tôi hiểu rằng "web.config bị bỏ qua" là cái trong thư mục gốc. Tôi đã sử dụng nó vài lần thành công. Đảm bảo ứng dụng con không phụ thuộc vào cấu hình trong web.config gốc (thử chạy ứng dụng con trong thư mục gốc riêng).
Matteo Sganzetta

1
Bạn cũng có thể kiểm tra phương pháp số 2 trên trang này, mặc dù tôi chưa thử nó iislogs.com/steveschofield/2009/09/20/ợi
Matteo Sganzetta

ứng dụng con tôi thực sự là một bản sao chính xác của ứng dụng cha mẹ. Tôi muốn có thể đặt /previewđể mọi người có thể thử nghiệm phiên bản mới trước khi phát hành trực tuyến. Mọi người luôn đề nghị <location>khắc phục vấn đề này vì vậy tôi rất hào hứng khi đọc bài viết của bạn. Tuy nhiên, nó phàn nàn The entry 'default' has already been added.về một mục cấu hình liên quan đến AppFoven ngay cả khi tôi sử dụngenableConfigurationOverride="false"
Simon_Weaver

Ngoài ra, nếu tôi cài đặt enableConfigurationOverride="false"trên ứng dụng gốc của mình, nó sẽ giết hoàn toàn ứng dụng gốc và nó thậm chí sẽ không hoạt động :-(
Simon_Weaver


1

Chúng tôi đang gặp lỗi về các chỉ thị cấu hình trùng lặp trên một trong các ứng dụng của chúng tôi. Sau khi điều tra có vẻ như đó là do vấn đề này .

Tóm lại, trang web gốc của chúng tôi là ASP.NET 3.5 (là 2.0 với các thư viện cụ thể được thêm vào) và chúng tôi có một ứng dụng con đó là ASP.NET 4.0.

kế thừa web.config làm cho ứng dụng phụ ASP.NET 4.0 kế thừa tệp web.config của ứng dụng ASP.NET 3.5 gốc.

Tuy nhiên, web.config toàn cầu (hoặc "root") của ứng dụng ASP.NET 4.0, nằm trong C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config và C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (tùy thuộc vào độ bit của bạn), đã chứa các phần cấu hình này.

Sau đó, ứng dụng ASP.NET 4.0 cố gắng hợp nhất với web.config ASP.NET 4.0 và web.config gốc (ứng dụng dành cho ứng dụng ASP.NET 3.5) và chạy thành các bản sao trong nút.

Giải pháp duy nhất tôi có thể tìm thấy là xóa các phần cấu hình khỏi web.config cha, và sau đó

  1. Xác định rằng bạn không cần chúng trong ứng dụng gốc của mình hoặc nếu bạn làm
  2. Nâng cấp ứng dụng mẹ lên ASP.NET 4.0 (để nó có quyền truy cập vào cấu hình gốc của web.config)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.