Evitare l'ereditarietà di web.config nell'applicazione Web figlio utilizzando inheritInChildApplications


153

Sto provando ad aggiungere

<location inheritInChildApplications="false">

al web.config dell'applicazione web principale, ma non sembra funzionare.

I miei genitori web.confighanno:

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

L'applicazione Web di mio figlio è configurata come applicazione in IIS e sta ereditando da quella del genitore web.configche causa problemi.

Dove esattamente dovrei posizionare il

<location inheritInChildApplications="false">

quindi ignora tutte le varie impostazioni web.config?

Risposte:


203

Come indicato nei commentatori della risposta precedente, non puoi semplicemente aggiungere la riga ...

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

... appena sotto <configuration>. Invece, è necessario racchiudere le singole sezioni web.config per le quali si desidera disabilitare l'ereditarietà. Per esempio:

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

Sebbene <clear />possa funzionare per alcune sezioni di configurazione, ci sono alcune che invece richiedono una <remove name="...">direttiva, e altre ancora non sembrano supportare neanche. In queste situazioni, è probabilmente opportuno impostare inheritInChildApplications="false".


11
È possibile farlo al contrario? Trovo strano che devo aggiornare il genitore, quando è il figlio che decide se le impostazioni devono essere ereditate o meno.
nabeelfarid,

@nabeelfarid - Sono completamente d'accordo. Se hai un blog wordpress all'interno di un'applicazione .NET con un web.config complesso, può essere una seccatura occuparsi di cancellarlo o prevenire l'ereditarietà. Penso che l'intero sistema di "localizzazione" sia progettato più per la sicurezza degli host condivisi che per i problemi di compatibilità che la maggior parte delle persone si trova qui
Simon_Weaver

Questo non funziona per me? qualche idea? Ho un servizio wcf che ha la configurazione padre impostata sulla connessione al database SIT. Ho un'altra cartella nello stesso servizio che dice "QA" e contiene gli stessi file di servizio WCF come in SIT incluso il web.config ma che punta il database al QA. Quando chiamo il servizio wcf all'interno della cartella "QA", prende la connessione solo dalla configurazione del genitore (anche io do il tag <location>). Per favore fatemi sapere quale sarebbe il problema.
Superachu,

@NickCecil come posso ottenere questo risultato in IIS 6? inheritInChildApplicationsnon viene accettato come parametro valido per l' <location />elemento. Il mio sito Web esegue SharePoint (2007). Ho creato un'applicazione in una directory virtuale sotto questo sito Web, gestita dal suo pool di applicazioni. Tuttavia, sto riscontrando conflitti tra la configurazione di SharePoint e questa applicazione. Vedi questa domanda che ho pubblicato in Server Fault.
Utente Web

1
La mia applicazione che ho creato come figlio di un sito Web vuole ancora caricare le DLL dal sito Web padre. Apparentemente, non posso usare <location>per l'autonomia ...
Francis Ducharme,

65

Deve andare direttamente sotto il <configuration>nodo radice ed è necessario impostare un percorso come questo:

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

Un modo migliore per gestire l'ereditarietà della configurazione è utilizzare a <clear/>nella configurazione figlio dove non si desidera ereditare. Quindi se non volessi ereditare le stringhe di connessione della configurazione genitore, faresti qualcosa del genere:

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

17
Ottengo questo errore "Impossibile leggere la sezione di configurazione 'configSections' perché manca una dichiarazione di sezione" nel file web.config dei miei genitori.
Blankman,

Puoi pubblicare la tua configurazione con l'elemento <location> in esso? Vorrei anche controllare la mia modifica e vedere se <clear /> potrebbe essere un approccio migliore per quello che stai cercando di fare.
Andrew Hare,

6
non funziona quando lo metti proprio in <configurazione>. Puoi concludere, diciamo il nodo <system.web> ma non puoi semplicemente inserirlo nella radice in questo modo.
Positivo

Se lo metti in <configurazione> come secondo nodo in, otterrai "l'attributo ereditInChildApplications non è dichiarato". Quindi non è un attributo valido a quel livello in web.config. Quindi, come puoi dire che ha funzionato?
Positivo

12
-1: posso anche confermare che l'utilizzo dell'elemento location come mostrato sopra NON funziona.
Adrian Grigore,

23

Metto tutto in:

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

ad eccezione di: <configSections/> , <connectionStrings/>e<runtime/> .

Ci sono alcuni casi in cui non vogliamo ereditare alcune secrezioni <configSections />, ma non possiamo dirlo<section/> tag <location/>, quindi dobbiamo creare un<secionGroup /> e inserire le nostre sezioni indesiderate in quel gruppo. I gruppi di sezioni possono essere successivamente inseriti in un tag di posizione.

Quindi dobbiamo cambiare questo:

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

In:

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

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

Ho sezioni personalizzate
Kiquenet,

Questo ha risolto il mio problema. Avevo un'app Web con EF6.1.3 e un'app Web figlio con EF5. L'aggiornamento dell'app Web per bambini era fuori discussione, quindi ho dovuto usare questa tecnica per far funzionare e funzionare. Ho seguito questo esempio, cambiando myNotInheritedSectionsin ef6Privateed unwantedSectionè la entityFrameworksezione.
Mohamed Nuur,

Puoi aiutarmi perché il mio non funziona, ecco il mio codice <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

Stavamo riscontrando un errore correlato a questo dopo una recente versione di codice in uno dei nostri ambienti di sviluppo. Abbiamo un'applicazione figlia di un'altra applicazione. Questa relazione ha funzionato bene per gli ANNI fino a ieri.

Il problema:
si verificava un errore di traccia dello stack giallo dovuto all'immissione di chiavi duplicate. Questo perché sia ​​web.config per le applicazioni figlio che parent avevano questa chiave. Ma questo è esistito per molti anni come questo senza cambiamenti. Perché all'improvviso è un problema ora?

La soluzione:
il motivo per cui questo non è mai stato un problema è perché le chiavi E i valori erano sempre gli stessi. Ieri abbiamo aggiornato le nostre stringhe di connessione SQL per includere il Nome applicazione nella stringa di connessione. Ciò ha reso la stringa unica e all'improvviso ha iniziato a fallire.

Senza fare alcuna ricerca sul motivo esatto di ciò, devo presumere che quando l'applicazione figlio eredita i valori web.config dei genitori, ignora coppie chiave / valore identiche.

Siamo riusciti a risolverlo avvolgendo la stringa di connessione in questo modo

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

Modificare: ho dimenticato di dire che l'ho aggiunto nel web.config di PARENTS. Non ho dovuto modificare web.config del bambino.

Grazie per l'aiuto di tutti su questo, salvato i nostri mozziconi.


6

Se (come ho capito) stai cercando di bloccare completamente l'ereditarietà nella configurazione web della tua applicazione figlio, ti suggerisco di evitare di usare il tag in web.config. Crea invece un nuovo apppool e modifica il file applicationHost.config (che si trova in% WINDIR% \ System32 \ inetsrv \ Config e% WINDIR% \ SysWOW64 \ inetsrv \ config). Devi solo trovare la voce per il tuo apppool e aggiungere l'attributo enableConfigurationOverride="false"come nel seguente esempio:

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

Ciò eviterà l'ereditarietà della configurazione nelle applicazioni servite da MyAppPool.

Matteo


1
MSDN dice "Se falso, tutte le impostazioni nei file Web.config verranno ignorate per questo pool di applicazioni" e questo non sembra proprio ciò che pensi significhi. ADORO che questa sia la risposta giusta, ma non riesco proprio a farlo funzionare. Mi sembra quasi che questa impostazione significhi "non autorizzare completamente un web.config locale per questo apppool"
Simon_Weaver,

Quindi, in pratica, le applicazioni in questo pool di app dovrebbero funzionare senza un file web.config? Capisco che "web.config ignorato" è quello nella cartella principale. L'ho usato alcune volte con successo. Assicurarsi che l'applicazione figlio non dipenda dalle configurazioni nel web.config di root (provare a eseguire l'app figlio in una cartella radice separata).
Matteo Sganzetta,

1
Puoi anche controllare il metodo n. 2 in questa pagina, anche se non l'ho provato iislogs.com/steveschofield/2009/09/20/…
Matteo Sganzetta,

la mia domanda figlio è in realtà una copia esatta della domanda principale. Voglio essere in grado di mettere in /previewmodo che le persone possano testare una nuova versione prima di renderla attiva. Tutti suggeriscono sempre <location>di risolvere questo problema, quindi ero molto entusiasta di leggere il tuo post. Tuttavia si lamenta The entry 'default' has already been added.per una voce di configurazione relativa a AppFabric anche quando usoenableConfigurationOverride="false"
Simon_Weaver,

anche se imposto enableConfigurationOverride="false"sulla mia applicazione di root uccide completamente l'applicazione di root e non funzionerà nemmeno :-(
Simon_Weaver


1

Stiamo ricevendo errori sulle direttive di configurazione duplicate su una delle nostre app. Dopo le indagini sembra che sia a causa di questo problema .

In breve, il nostro sito Web principale è ASP.NET 3.5 (che è 2.0 con l'aggiunta di librerie specifiche) e abbiamo una sotto-applicazione ASP.NET 4.0.

L'ereditarietà web.config fa sì che la sotto-applicazione ASP.NET 4.0 erediti il ​​file web.config dell'applicazione ASP.NET 3.5 padre.

Tuttavia, web.config globale (o "root") dell'applicazione ASP.NET 4.0, che risiede in C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config e C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (a seconda del tuo testimone), contiene già queste sezioni di configurazione.

L'app ASP.NET 4.0 tenta quindi di unire insieme il web.config ASP.NET 4.0 di root e il web.config principale (quello per un'app ASP.NET 3.5) e viene eseguito in duplicati nel nodo.

L'unica soluzione che sono stato in grado di trovare è quella di rimuovere le sezioni di configurazione dal web.config principale, e quindi anche

  1. Determina che non ne hai bisogno nell'applicazione di root o se lo fai
  2. Aggiorna l'app padre ad ASP.NET 4.0 (in modo da ottenere l'accesso alle configSections di root web.config)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.