inheritInChildApplications를 사용하여 자식 웹 응용 프로그램에서 web.config 상속을 피하십시오.


153

추가하려고합니다

<location inheritInChildApplications="false">

부모 웹 응용 프로그램의 web.config에 있지만 작동하지 않는 것 같습니다.

부모님 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-전적으로 동의합니다. 복잡한 web.config가있는 .NET 응용 프로그램에 wordpress 블로그가 있으면 지우거나 상속을 방지하는 데 큰 어려움이 될 수 있습니다. 전체 '위치'시스템은 대부분의 사람들이 여기에서 찾고있는 호환성 문제에 대해 공유 호스트의 보안을 중심으로 설계되었다고 생각합니다.
Simon_Weaver

이것은 나를 위해 작동하지 않습니까? 이견있는 사람? 부모 구성이 SIT 데이터베이스 연결로 설정된 wcf 서비스가 있습니다. 동일한 서비스에 "QA"라는 다른 폴더가 있으며 web.config를 포함하지만 데이터베이스를 QA로 가리키는 SIT와 동일한 WCF 서비스 파일이 포함되어 있습니다. "QA"폴더 내에서 wcf 서비스를 호출하면 <config> 태그를 제공하더라도 상위 구성에서만 연결됩니다. 문제가 무엇인지 알려주십시오.
superachu

@NickCecil IIS 6에서 어떻게 이것을 달성합니까? 요소 inheritInChildApplications의 유효한 매개 변수로 허용되지 않습니다 <location />. 내 웹 사이트에서 SharePoint (2007)를 실행 중입니다. 이 웹 사이트의 가상 디렉터리에 자체 응용 프로그램 풀에서 관리하는 응용 프로그램을 만들었습니다. 그러나 SharePoint 구성과이 응용 프로그램간에 충돌이 발생했습니다. Server Fault에 게시 한이 질문을 참조하십시오 .
웹 사용자

1
웹 사이트의 자식으로 만든 응용 프로그램은 여전히 ​​부모 웹 사이트에서 DLL을로드하려고합니다. 분명히, 나는 <location>런타임에 사용할 수 없습니다 ...
Francis Ducharme

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
부모 web.config 파일에서 "configSections"구성 섹션을 읽을 수 없습니다 "라는 오류가 발생합니다.
Blankman

<location> 요소를 사용하여 구성을 게시 할 수 있습니까? 또한 편집 내용을 확인하고 <clear />가 수행하려는 작업에 더 적합한 방법인지 확인합니다.
Andrew Hare

6
<configuration> 바로 아래에 넣으면 작동하지 않습니다. 랩핑하면 <system.web> 노드라고 할 수 있지만 루트에 넣을 수는 없습니다.
PositiveGuy

두 번째 노드로 <configuration> 아래에 놓으면 "inheritInChildApplications 속성이 선언되지 않았습니다"가 표시됩니다. 따라서 web.config의 해당 수준에서 유효한 속성이 아닙니다. 어떻게 이것이 효과가 있다고 말할 수 있습니까?
PositiveGuy

12
-1 : 위의 위치 요소 사용이 작동하지 않음을 확인할 수도 있습니다.
Adrian Grigore

23

나는 모든 것을 넣었다.

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

다음을 제외 <configSections/>, <connectionStrings/>하고 <runtime/>.

거기에서 우리는 일부 secions을 상속하지 않으려는 경우가 있습니다 <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의 자식 웹 앱이 있습니다. 자식 웹 앱을 업그레이드하는 것은 의문의 여지가 없었 으므로이 기술을 사용하여 작동하고 작동해야했습니다. I는 변경이 예를 다음 myNotInheritedSectionsef6PrivateunwantedSection는 IS 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은 'false 인 경우 Web.config 파일의 모든 설정이이 응용 프로그램 풀에 대해 무시되며 이는 생각한대로 보이지 않습니다.'라고 말합니다. 나는 이것이 정답이라고 사랑하지만 나는 그것을 작동시킬 수 없다.이 설정은 '이 apppool에 대한 로컬 web.config를 완전히 허용하지 않음'을 의미하는 것처럼 보입니다.
Simon_Weaver

따라서 기본적 으로이 응용 프로그램 풀의 응용 프로그램은 web.config 파일없이 작동해야합니까? "ignored web.config"는 루트 폴더에있는 것으로 이해합니다. 나는 그것을 몇 번 성공적으로 사용했다. 자식 응용 프로그램이 루트 web.config의 구성에 의존하지 않는지 확인하십시오 (자식 응용 프로그램을 별도의 루트 폴더에서 실행 해보십시오).
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 하위 응용 프로그램은 부모 ASP.NET 3.5 응용 프로그램의 web.config 파일을 상속합니다.

그러나 ASP.NET 4.0 응용 프로그램의 전역 (또는 "루트") web.config는 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 앱용)를 병합하려고 시도하고 노드에서 복제본으로 실행됩니다.

내가 찾은 유일한 해결책은 부모 web.config에서 구성 섹션을 제거 한 다음

  1. 루트 응용 프로그램에서 필요하지 않은지 또는 필요한지 확인하십시오.
  2. 부모 응용 프로그램을 ASP.NET 4.0으로 업그레이드하여 루트 web.config의 configSections에 액세스합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.