inheritInChildApplicationsを使用して子Webアプリケーションでweb.config継承を回避する


153

追加しようとしています

<location inheritInChildApplications="false">

親のWebアプリケーションの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>

私の子Webアプリケーションは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 />、いくつかの構成セクションのための5月の仕事、そこの代わりに必要とするいくつかある<remove name="...">ディレクティブは、まだ他の人は、どちらかをサポートしていないようです。これらの状況では、を設定することがおそらく適切inheritInChildApplications="false"です。


11
それを逆に行うことは可能ですか?設定を継承するかどうかを決定するのが子である場合、親を更新しなければならないのは不思議です。
nabeelfarid 2013年

@nabeelfarid-私は完全に同意します。複雑なweb.configを使用した.NETアプリケーション内にワードプレスブログがある場合、それをクリアするか、継承を妨げるのは非常に困難です。私は「ロケーション」システム全体が共有ホストのセキュリティを中心に設計されていると思います。互換性の問題のために、ほとんどの人がここで自分自身を見つけています
Simon_Weaver

これは私にはうまくいきませんか?何かご意見は?親構成がSITデータベース接続に設定されているwcfサービスがあります。「QA」と同じサービスに別のフォルダーがあり、web.configを含むSITと同じWCFサービスファイルが含まれていますが、データベースはQAを指しています。「QA」フォルダー内のwcfサービスを呼び出すと、親構成からのみ接続が取得されます(<location>タグを指定した場合でも)。何が問題になるか教えてください。
superachu 2014

@NickCecil IIS 6でこれを実現するにはどうすればよいですか?要素のinheritInChildApplications有効なパラメータとして受け入れられていません<location />。私のWebサイトはSharePoint(2007)を実行しています。このWebサイトの下の仮想ディレクトリに、独自のアプリケーションプールによって管理されるアプリケーションを作成しました。それでも、SharePointの構成とこのアプリケーションの間で競合が発生しています。Server Faultに投稿したこの質問を参照してください。
Webユーザー

1
Webサイトの子として作成したアプリケーションでも、親Webサイトから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'を読み取れません」というエラーが表示されます。
ブランクマン

<location>要素を含む構成を投稿できますか?私はまた、私の編集をチェックして、<clear />があなたがやろうとしていることに対してより良いアプローチであるかどうかを確認します。
Andrew Hare、

6
<設定>のすぐ下に置くと機能しません。<system.web>ノードをラップすることはできますが、このようにルートに配置することはできません。
PositiveGuy

2番目のノードとして<configuration>の下に置くと、「inheritInChildApplications属性が宣言されていません」が取得されます。したがって、web.configのそのレベルでは有効な属性ではありません。それで、これはどのように機能したと言えますか?
PositiveGuy

12
-1:上記のようにlocation要素を使用しても機能しないことも確認できます。
エイドリアングリゴー

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

これで私の問題は解決しました。EF6.1.3のWebアプリとEF5の子Webアプリがありました。子Webアプリのアップグレードは問題外だったので、この手法を使用して両方を機能させる必要がありました。私は、この例に続い変えることmyNotInheritedSectionsef6PrivateしてunwantedSectionいるentityFrameworkセクション。
Mohamed Nuur 2017年

私のコードが機能しない理由を教えてください。これが私のコードです。 <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

開発環境の1つにコードを最近リリースした後、これに関連するエラーが発生しました。別のアプリケーションの子であるアプリケーションがあります。この関係は、昨日までYEARSにとって問題なく機能してきました。

問題:
重複したキーが入力されたために黄色のスタックトレースエラーが発生しました。これは、子アプリケーションと親アプリケーションの両方のweb.configにこのキーがあったためです。しかし、これはこのように何年もの間、変化なく存在していました。なぜ今突然すべてが問題になっているのですか?

解決策:
これが問題にならない理由は、キーと値が常に同じであるためです。昨日、SQL接続文字列を更新して、接続文字列にアプリケーション名を含めました。これは文字列を独特にし、突然すべてが失敗し始めました。

この正確な理由を調査せずに、子アプリケーションが親のweb.config値を継承する場合、同一のキーと値のペアを無視すると想定する必要があります。

このように接続文字列をラップすることで解決できました

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

編集:私はこれをPARENTS web.configに追加したことを忘れていました。子のweb.configを変更する必要はありませんでした。

みんなの助けてくれてありがとう。


6

(私が理解しているように)子アプリケーションのWeb構成で継承を完全にブロックしようとしている場合は、web.configでタグを使用しないことをお勧めします。代わりに、新しいapppoolを作成し、applicationHost.configファイル(%WINDIR%\ System32 \ inetsrv \ Configおよび%WINDIR%\ SysWOW64 \ inetsrv \ configにあります)を編集します。enableConfigurationOverride="false"次の例のように、アプリプールのエントリを見つけて属性を追加するだけです。

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

これにより、MyAppPoolによって提供されるアプリケーションでの構成の継承が回避されます。

マッテオ


1
MSDNは「falseの場合、Web.configファイルのすべての設定はこのアプリケーションプールでは無視されます」と言っており、それはあなたがそれを意味しているようには見えません。私はこれが正しい答えになるのが好きですが、私はそれを機能させることができません。この設定は「このアプリプールのローカルweb.configを完全に禁止する」ことを意味するように私にはほとんど見えます
Simon_Weaver

基本的に、このアプリプールの下のアプリケーションは、web.configファイルがなくても機能するはずです。「無視されたweb.config」がルートフォルダにあるものであることを理解しています。何度かうまく使った。子アプリケーションがルートweb.configの構成に依存しないことを確認してください(子アプリを別のルートフォルダーで実行してみてください)。
Matteo Sganzetta、2015年

1
私はそれをテストしていませんが、あなたはまた、このページに方法#2を確認することができますiislogs.com/steveschofield/2009/09/20/...
マッテオSganzetta

私の子アプリケーションは、実際には親アプリケーションの正確なコピーです。/preview新しいバージョンを公開する前に、人々がテストできるようにしたいと思っています。誰もが常に<location>この問題の修正を提案しているので、私はあなたの投稿を読んでとても興奮しました。ただしThe entry 'default' has already been added.、AppFabric関連の構成エントリについて、私が使用している場合でも文句を言いますenableConfigurationOverride="false"
Simon_Weaver

またenableConfigurationOverride="false"、ルートアプリケーションを設定すると、ルートアプリケーションが完全に強制終了され、機能しません:-(
Simon_Weaver


1

アプリの1つで設定ディレクティブが重複しているというエラーが発生します。調査後、この問題が原因のようです。

簡単に言うと、ルートWebサイトはASP.NET 3.5(特定のライブラリが追加された2.0)であり、ASP.NET 4.0のサブアプリケーションがあります。

web.config継承により、ASP.NET 4.0サブアプリケーションは親ASP.NET 3.5アプリケーションのweb.configファイルを継承します。

ただし、C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.configおよびC:\ Windows \ MicrosoftにあるASP.NET 4.0アプリケーションのグローバル(または「ルート」)web.config。 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.