Vermeiden Sie die Vererbung von web.config in untergeordneten Webanwendungen mithilfe von inheritInChildApplications

153

Ich versuche hinzuzufügen

<location inheritInChildApplications="false">

auf die web.config meiner übergeordneten Webanwendung, aber es scheint nicht zu funktionieren.

Meine Eltern web.confighaben:

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

Meine untergeordnete Webanwendung wird als Anwendung in IIS eingerichtet und erbt von der übergeordneten Anwendung, web.configwas zu Problemen führt.

Wo genau soll ich das platzieren

<location inheritInChildApplications="false">

ignoriert es also alle verschiedenen web.config Einstellungen?

Blankman
quelle

Antworten:

203

Wie die Kommentatoren für die vorherige Antwort erwähnt haben, können Sie die Zeile nicht einfach hinzufügen ...

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

... direkt darunter <configuration>. Stattdessen müssen Sie die einzelnen Abschnitte von web.config umbrechen, für die Sie die Vererbung deaktivieren möchten. Beispielsweise:

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

Während dies <clear />möglicherweise für einige Konfigurationsabschnitte funktioniert, gibt es einige, für die stattdessen eine <remove name="...">Direktive erforderlich ist , und andere scheinen dies ebenfalls nicht zu unterstützen. In diesen Situationen ist es wahrscheinlich angebracht, einzustellen inheritInChildApplications="false".

Nick Cecil
quelle
11
Ist es möglich, es umgekehrt zu machen? Ich finde es seltsam, dass ich den Elternteil aktualisieren muss, wenn das Kind entscheidet, ob die Einstellungen vererbt werden sollen oder nicht.
Nabeelfarid
@nabeelfarid - da stimme ich voll und ganz zu. Wenn Sie ein WordPress-Blog in einer .NET-Anwendung mit einer komplexen web.config haben, kann es sehr schwierig sein, es zu löschen oder die Vererbung zu verhindern. Ich denke, das gesamte "Location" -System ist mehr auf Sicherheit für gemeinsam genutzte Hosts ausgelegt, für die sich die meisten Leute aus Kompatibilitätsgründen hier befinden
Simon_Weaver
Das funktioniert bei mir nicht? Irgendwelche Gedanken? Ich habe einen wcf-Dienst, dessen übergeordnete Konfiguration auf SIT-Datenbankverbindung eingestellt ist. Ich habe einen anderen Ordner im selben Dienst, der "QA" sagt, und er enthält dieselben WCF-Dienstdateien wie in SIT, einschließlich der Datei web.config, zeigt jedoch die Datenbank auf QA. Wenn ich den wcf-Dienst im Ordner "QA" aufrufe, wird die Verbindung nur über die übergeordnete Konfiguration hergestellt (auch wenn ich das Tag <location> gebe). Bitte lassen Sie mich wissen, was das Problem sein würde.
Superachu
@NickCecil Wie erreiche ich dies in IIS 6? inheritInChildApplicationswird nicht als gültiger Parameter für das <location />Element akzeptiert . Auf meiner Website wird SharePoint (2007) ausgeführt. Ich habe eine Anwendung in einem virtuellen Verzeichnis unter dieser Website erstellt, das von einem eigenen Anwendungspool verwaltet wird. Es treten jedoch Konflikte zwischen der SharePoint-Konfiguration und dieser Anwendung auf. Siehe diese Frage, die ich in Serverfehler gepostet habe.
Web User
1
Meine Anwendung, die ich als untergeordnetes Element einer Website erstellt habe, möchte die DLLs weiterhin von der übergeordneten Website laden. Anscheinend kann ich nicht <location>für die Laufzeit verwenden ...
Francis Ducharme
65

Es muss direkt unter dem <configuration>Stammknoten liegen und Sie müssen einen Pfad wie folgt festlegen:

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

Eine bessere Möglichkeit, die Konfigurationsvererbung zu handhaben, besteht darin, eine <clear/>in der untergeordneten Konfiguration zu verwenden, wo immer Sie nicht erben möchten. Wenn Sie also die Verbindungszeichenfolgen der übergeordneten Konfiguration nicht erben möchten, gehen Sie folgendermaßen vor:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>
Andrew Hare
quelle
17
Ich erhalte die Fehlermeldung "Der Konfigurationsabschnitt 'configSections' kann nicht gelesen werden, da eine Abschnittsdeklaration fehlt" in der Datei web.config meiner Eltern.
Blankman
Können Sie Ihre Konfiguration mit dem Element <location> veröffentlichen? Ich würde auch meine Bearbeitung überprüfen und prüfen, ob <clear /> ein besserer Ansatz für das ist, was Sie versuchen zu tun.
Andrew Hare
6
Es funktioniert nicht, wenn Sie es direkt unter <Konfiguration> platzieren. Sie können den Knoten <system.web> umbrechen, aber Sie können ihn nicht einfach so in den Stamm einfügen.
PositiveGuy
Wenn Sie es als zweiten Knoten in <Konfiguration> einfügen, erhalten Sie das Attribut "inheritInChildApplications ist nicht deklariert". Es ist also kein gültiges Attribut auf dieser Ebene in der web.config. Wie können Sie also sagen, dass dies funktioniert hat?
PositiveGuy
12
-1: Ich kann auch bestätigen, dass die Verwendung des oben gezeigten Positionselements NICHT funktioniert.
Adrian Grigore
23

Ich habe alles in:

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

ausgenommen: <configSections/>, <connectionStrings/>und <runtime/>.

Es gibt einige Fälle, in denen wir einige Abschnitte nicht erben möchten <configSections />, aber kein <section/>Tag einfügen können. Daher <location/>müssen wir ein erstellen <secionGroup />und unsere unerwünschten Abschnitte in diese Gruppe einfügen . Abschnittsgruppen können später in ein Standort-Tag eingefügt werden.

Also müssen wir das ändern:

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

In:

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

<location path="." inheritInChildApplications="false">
    <myNotInheritedSections>
        <unwantedSection />
    </myNotInheritedSections>
</location>
Cryss
quelle
Ich habe benutzerdefinierte Abschnitte
Kiquenet
Dies löste mein Problem. Ich hatte eine Web-App mit EF6.1.3 und eine untergeordnete Web-App mit EF5. Ein Upgrade der untergeordneten Web-App kam nicht in Frage, daher musste ich diese Technik verwenden, damit beide funktionieren und es funktioniert. Ich folgte diesem Beispiel und wechselte myNotInheritedSectionszu ef6Privateund unwantedSectionist der entityFrameworkAbschnitt.
Mohamed Nuur
Können Sie helfen, warum meine nicht funktioniert <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

Wir haben diesbezüglich einen Fehler erhalten, nachdem kürzlich Code für eine unserer Entwicklungsumgebungen veröffentlicht wurde. Wir haben eine Anwendung, die einer anderen Anwendung untergeordnet ist. Diese Beziehung hat seit JAHREN bis gestern gut funktioniert.

Das Problem:
Wir haben einen gelben Stapelverfolgungsfehler erhalten, weil doppelte Schlüssel eingegeben wurden. Dies liegt daran, dass sowohl die web.config für die untergeordnete als auch die übergeordnete Anwendung diesen Schlüssel hatte. Aber das gab es viele Jahre lang unverändert. Warum ist es jetzt plötzlich ein Problem?

Die Lösung:
Der Grund, warum dies nie ein Problem war, ist, dass die Schlüssel UND-Werte immer gleich waren. Gestern haben wir unsere SQL-Verbindungszeichenfolgen aktualisiert, um den Anwendungsnamen in die Verbindungszeichenfolge aufzunehmen. Dies machte die Saite einzigartig und begann plötzlich zu versagen.

Ohne den genauen Grund dafür zu untersuchen, muss ich davon ausgehen, dass die untergeordnete Anwendung, wenn sie die web.config-Werte der Eltern erbt, identische Schlüssel / Wert-Paare ignoriert.

Wir konnten es lösen, indem wir die Verbindungszeichenfolge so umschlossen

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

Bearbeiten: Ich habe vergessen zu erwähnen, dass ich dies in der PARENTS web.config hinzugefügt habe. Ich musste die web.config des Kindes nicht ändern.

Vielen Dank für jedermanns Hilfe, rettete unseren Hintern.

Kenneth Garza
quelle
6

Wenn Sie (soweit ich weiß) versuchen, die Vererbung in der Webkonfiguration Ihrer untergeordneten Anwendung vollständig zu blockieren, sollten Sie die Verwendung des Tags in web.config vermeiden. Erstellen Sie stattdessen einen neuen Apppool und bearbeiten Sie die Datei applicationHost.config (in% WINDIR% \ System32 \ inetsrv \ Config und% WINDIR% \ SysWOW64 \ inetsrv \ config). Sie müssen nur den Eintrag für Ihren Apppool finden und das Attribut enableConfigurationOverride="false"wie im folgenden Beispiel hinzufügen :

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

Dadurch wird die Vererbung der Konfiguration in den von MyAppPool bereitgestellten Anwendungen vermieden.

Matteo

Matteo Sganzetta
quelle
1
MSDN sagt 'Wenn false, werden alle Einstellungen in Web.config-Dateien für diesen Anwendungspool ignoriert' und das scheint einfach nicht so zu sein, wie Sie denken, dass es bedeutet. Ich würde LIEBEN, dass dies die richtige Antwort ist, aber ich kann es einfach nicht zum Laufen bringen. Es sieht für mich fast so aus, als würde diese Einstellung "eine lokale web.config für diesen Apppool vollständig verbieten" bedeuten
Simon_Weaver
Grundsätzlich sollen die Anwendungen in diesem App-Pool ohne die Datei web.config funktionieren? Ich verstehe, dass die "ignorierte web.config" die im Stammordner ist. Ich habe es einige Male erfolgreich benutzt. Stellen Sie sicher, dass die untergeordnete Anwendung nicht von den Konfigurationen in der Root-Datei web.config abhängt (versuchen Sie, die untergeordnete App in einem separaten Stammordner auszuführen).
Matteo Sganzetta
1
Sie können auch die Methode Nr. 2 auf dieser Seite überprüfen, obwohl ich sie nicht getestet habe. Iislogs.com/steveschofield/2009/09/20/…
Matteo Sganzetta
Meine untergeordnete Anwendung ist tatsächlich eine exakte Kopie der übergeordneten Anwendung. Ich möchte in der Lage sein, /previeweine neue Version zu testen, bevor sie live geschaltet wird. Jeder schlägt immer vor <location>, dieses Problem zu beheben, daher war ich sehr gespannt auf Ihren Beitrag. Es beschwert sich jedoch The entry 'default' has already been added.für einen AppFabric-bezogenen Konfigurationseintrag, selbst wenn ichenableConfigurationOverride="false"
Simon_Weaver
Auch wenn ich enableConfigurationOverride="false"meine Root-Anwendung einstelle, wird die Root-Anwendung vollständig beendet und es funktioniert nicht einmal :-(
Simon_Weaver
1

Wir erhalten Fehler bezüglich doppelter Konfigurationsanweisungen für eine unserer Apps. Nach der Untersuchung sieht es so aus, als ob es an diesem Problem liegt .

Kurz gesagt, unsere Stammwebsite ist ASP.NET 3.5 (2.0 mit bestimmten hinzugefügten Bibliotheken), und wir haben eine Unteranwendung, die ASP.NET 4.0 ist.

Die Vererbung von web.config bewirkt, dass die ASP.NET 4.0-Unteranwendung die Datei web.config der übergeordneten ASP.NET 3.5-Anwendung erbt.

Die globale (oder "root") web.config der ASP.NET 4.0-Anwendung befindet sich jedoch unter C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config und C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (abhängig von Ihrer Bitness) enthält diese Konfigurationsabschnitte bereits.

Die ASP.NET 4.0-App versucht dann, die Stamm-ASP.NET 4.0-Datei web.config und die übergeordnete web.config (die für eine ASP.NET 3.5-App) zusammenzuführen, und führt im Knoten auf Duplikate.

Die einzige Lösung, die ich finden konnte, besteht darin, die Konfigurationsabschnitte aus der übergeordneten web.config zu entfernen

  1. Stellen Sie fest, dass Sie sie in Ihrer Root-Anwendung nicht benötigt haben oder wenn Sie dies tun
  2. Aktualisieren Sie die übergeordnete App auf ASP.NET 4.0 (damit sie Zugriff auf die configSections der Root-Datei web.config erhält).
Josh
quelle