web-dev-qa-db-ja.com

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

私は追加しようとしています

<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設定を無視しますか?

148
Blankman

前の回答のコメント者が述べたように、単に行を追加することはできません...

<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"を設定することがおそらく適切です。

196
Nick Cecil

ルート<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>
62
Andrew Hare

私はすべてを入れます:

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

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

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

ソリューション:
これが問題にならなかった理由は、キーと値が常に同じだったからです。昨日、SQL接続文字列を更新して、接続文字列にアプリケーション名を含めました。これにより文字列が一意になり、突然すべてが失敗し始めました。

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

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

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

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

みんな助けてくれてありがとう、私たちの尻を救った。

8
Kenneth Garza

(私が理解しているように)子アプリケーションのWeb設定で継承を完全にブロックしようとしている場合、web.configでタグを使用しないようにすることをお勧めします。代わりに、新しいアプリケーションプールを作成し、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が提供するアプリケーションでの構成の継承が回避されます。

マッテオ

6

これはMicrosoftのlocationタグに関するページです。 http://msdn.Microsoft.com/en-us/library/b6x6shw7%28v=vs.100%29.aspx

それは一部の人々に役立つかもしれません。

2
Mark

アプリの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からconfigセクションを削除してから、

  1. ルートアプリケーションでそれらを必要としなかったか、または必要なら
  2. 親アプリをASP.NET 4.0にアップグレードします(したがって、ルートweb.configのconfigSectionsにアクセスできます)。
1
Josh