web-dev-qa-db-fra.com

Évitez l'héritage web.config dans une application Web enfant à l'aide de inheritInChildApplications

J'essaye d'ajouter

<location inheritInChildApplications="false">

web.config de mon application Web parent, mais cela ne semble pas fonctionner.

Le web.config de mon parent a:

<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'application Web de mon enfant est configurée comme une application dans IIS et hérite du web.config du parent, ce qui pose problème.

Où devrais-je placer le

<location inheritInChildApplications="false">

donc il ignore tous les différents paramètres web.config?

148
Blankman

Comme l'ont mentionné les intervenants de la réponse précédente, vous ne pouvez pas simplement ajouter la ligne ...

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

... juste en dessous de <configuration>. Au lieu de cela, vous devez envelopper les sections individuelles de web.config pour lesquelles vous souhaitez désactiver l'héritage. Par exemple:

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

Bien que <clear /> puisse fonctionner pour certaines sections de la configuration, certaines nécessitent une directive <remove name="...">, et d'autres ne semblent pas en prendre en charge non plus. Dans ces situations, il est probablement approprié de définir inheritInChildApplications="false".

196
Nick Cecil

Il doit aller directement sous le nœud racine <configuration> et vous devez définir un chemin comme celui-ci:

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

Une meilleure façon de gérer l'héritage de configuration consiste à utiliser un <clear/> dans la configuration de l'enfant partout où vous ne souhaitez pas hériter. Donc, si vous ne voulez pas hériter des chaînes de connexion de la configuration parent, vous feriez quelque chose comme ceci:

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

Je mets tout dans:

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

sauf: <configSections/>, <connectionStrings/> et <runtime/>.

Il y a des cas où nous ne voulons pas hériter de sections de <configSections />, mais nous ne pouvons pas mettre la balise <section/> dans <location/>, nous devons donc créer un <secionGroup /> et mettre nos sections indésirables dans ce groupe. Les groupes de sections peuvent être insérés ultérieurement dans une balise d'emplacement.

Nous devons donc changer ceci:

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

Dans:

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

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

Nous avons eu une erreur liée à cela après une récente publication de code dans l'un de nos environnements de développement. Nous avons une application qui est un enfant d'une autre application. Cette relation a bien fonctionné pendant des années jusqu'à hier.

Le problème:
Nous avons eu une erreur de trace de pile jaune en raison de la saisie de clés en double. Cela est dû au fait que les clés web.config des applications enfant et parent avaient cette clé. Mais cela a existé pendant de nombreuses années sans changement. Pourquoi tout d'un coup c'est un problème maintenant?

La solution:
Si cela n’a jamais posé de problème, c’est que les clés ET les valeurs étaient toujours les mêmes. Hier, nous avons mis à jour nos chaînes de connexion SQL afin d'inclure le nom de l'application dans la chaîne de connexion. Cela a rendu la chaîne unique et a soudainement commencé à échouer.

Sans faire de recherche sur la raison exacte de cela, je dois supposer que lorsque l'application enfant hérite des valeurs web.config des parents, elle ignore les paires clé/valeur identiques.

Nous avons pu le résoudre en encapsulant la chaîne de connexion comme ceci

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

Edit: J'ai oublié de mentionner que j'ai ajouté ceci dans le fichier web.config des PARENTS. Je n'ai pas eu à modifier le fichier web.config de l'enfant.

Merci pour tout le monde aide sur cela, sauvé nos fesses.

8
Kenneth Garza

Si (si j'ai bien compris) vous essayez de bloquer complètement l'héritage dans la configuration Web de votre application enfant, je vous suggère d'éviter d'utiliser la balise dans web.config. Au lieu de cela, créez un nouvel apppool et modifiez le fichier applicationHost.config (situé dans% WINDIR%\System32\inetsrv\Config et% WINDIR%\SysWOW64\inetsrv\config). Vous devez juste trouver l'entrée de votre apppool et ajouter l'attribut enableConfigurationOverride="false" comme dans l'exemple suivant:

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

Cela évitera l'héritage de configuration dans les applications servies par MyAppPool.

Matteo

6
Matteo Sganzetta

Voici la page de Microsoft sur la balise location: http://msdn.Microsoft.com/en-us/library/b6x6shw7%28v=vs.100%29.aspx

Cela peut être utile à certaines personnes.

2
Mark

Nous avons des erreurs concernant les directives de configuration en double sur l'une de nos applications. Après enquête, il semble que ce soit à cause de ce problème .

En résumé, notre site Web racine est ASP.NET 3.5 (c'est-à-dire 2.0 avec des bibliothèques spécifiques ajoutées) et nous avons une sous-application qui est ASP.NET 4.0.

l'héritage web.config fait en sorte que la sous-application ASP.NET 4.0 hérite du fichier web.config de l'application parent ASP.NET 3.5.

Toutefois, le fichier Web.config global (ou "racine") de l'application ASP.NET 4.0, qui réside dans C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config et C:\Windows\Microsoft. NET\Framework64\v4.0.30319\Config\web.config (selon votre qualité de bits) contient déjà ces sections de configuration.

L'application ASP.NET 4.0 tente ensuite de fusionner le web.config ASP.NET 4.0 racine et le web.config parent (celui d'une application ASP.NET 3.5), et s'exécute en double dans le nœud.

La seule solution que j'ai pu trouver consiste à supprimer les sections config du fichier web.config parent, puis

  1. Déterminez que vous n'en avez pas besoin dans votre application racine, ou si vous en avez besoin
  2. Mettez à niveau l'application parente vers ASP.NET 4.0 (afin qu'elle obtienne l'accès aux sections de configuration racine de web.config)
1
Josh