Unikaj dziedziczenia web.config w podrzędnych aplikacjach internetowych przy użyciu inheritInChildApplications

153

Próbuję dodać

<location inheritInChildApplications="false">

do pliku web.config mojej nadrzędnej aplikacji internetowej, ale wygląda na to, że nie działa.

Moi rodzice web.configmają:

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

Moja podrzędna aplikacja internetowa jest skonfigurowana jako aplikacja w usługach IIS i dziedziczy po aplikacji rodzica, web.configktóra powoduje problemy.

Gdzie dokładnie powinienem umieścić plik

<location inheritInChildApplications="false">

więc ignoruje wszystkie różne ustawienia web.config?

Blankman
źródło

Odpowiedzi:

203

Jak wspomnieli komentatorzy poprzedniej odpowiedzi, nie możesz po prostu dodać linii ...

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

... tuż poniżej <configuration>. Zamiast tego musisz opakować poszczególne sekcje web.config, dla których chcesz wyłączyć dziedziczenie. Na przykład:

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

Chociaż <clear />może to działać w przypadku niektórych sekcji konfiguracyjnych, są takie, które zamiast tego wymagają <remove name="...">dyrektywy, a jeszcze inne też nie obsługują. W takich sytuacjach prawdopodobnie należy ustawić inheritInChildApplications="false".

Nick Cecil
źródło
11
Czy można to zrobić na odwrót? Dziwnie mi się wydaje, że muszę aktualizować rodzica, kiedy to dziecko decyduje, czy ustawienia mają być dziedziczone, czy nie.
nabeelfarid
@nabeelfarid - całkowicie się zgadzam. Jeśli masz blog Wordpress w aplikacji .NET ze złożonym plikiem web.config, usuwanie go lub zapobieganie dziedziczeniu może być ogromnym problemem. Myślę, że cały system
``
To nie działa dla mnie? jakieś pomysły? Mam usługę wcf, która ma konfigurację nadrzędną ustawioną na połączenie z bazą danych SIT. Mam inny folder w tej samej usłudze z napisem „QA” i zawiera te same pliki usług WCF, co w SIT, w tym plik web.config, ale wskazujący bazę danych do kontroli jakości. Kiedy wywołuję usługę wcf znajdującą się w folderze „QA”, pobiera ona połączenie tylko z konfiguracji nadrzędnej (nawet jeśli podam tag <location>). Daj mi znać, jaki byłby problem.
superachu
@NickCecil jak to osiągnąć w usługach IIS 6? inheritInChildApplicationsnie jest akceptowany jako prawidłowy parametr <location />elementu. W mojej witrynie internetowej działa program SharePoint (2007). Stworzyłem aplikację w wirtualnym katalogu na tej stronie, zarządzanym przez własną pulę aplikacji. Jednak napotykam konflikty między konfiguracją SharePoint a tą aplikacją. Zobacz to pytanie, które opublikowałem w sekcji Błąd serwera.
Użytkownik sieciowy
1
Moja aplikacja, którą utworzyłem jako dziecko witryny internetowej, nadal chce ładować biblioteki DLL z witryny nadrzędnej. Najwyraźniej nie mogę używać <location>do uruchamiania ...
Francis Ducharme
65

Musi przejść bezpośrednio pod <configuration>węzeł główny i musisz ustawić taką ścieżkę:

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

Lepszym sposobem obsługi dziedziczenia konfiguracji jest użycie <clear/>w konfiguracji podrzędnej wszędzie tam, gdzie nie chcesz dziedziczyć. Więc jeśli nie chcesz dziedziczyć parametrów połączenia konfiguracji nadrzędnej, zrobiłbyś coś takiego:

<?xml version="1.0"?>
<configuration>
    <connectionStrings>
        <clear/>
        <!-- Child config's connection strings -->
    </connectionStrings>
</configuration>
Andrew Hare
źródło
17
Otrzymuję ten błąd „Nie można odczytać sekcji konfiguracji„ configSections ”, ponieważ brakuje w niej deklaracji sekcji” w moim nadrzędnym pliku web.config.
Blankman
Czy możesz opublikować swoją konfigurację z elementem <location>? Chciałbym również sprawdzić moją edycję i zobaczyć, czy <clear /> może być lepszym podejściem do tego, co próbujesz zrobić.
Andrew Hare
6
nie działa, gdy umieścisz go bezpośrednio w <konfiguracji>. Możesz zawinąć, powiedzmy, węzeł <system.web>, ale nie możesz po prostu umieścić go w katalogu głównym w ten sposób.
PositiveGuy
Jeśli umieścisz go pod <configuration> jako drugim węzłem w, otrzymasz „atrybut inheritInChildApplications nie jest zadeklarowany”. Więc nie jest to prawidłowy atrybut na tym poziomie w pliku web.config. Jak więc możesz powiedzieć, że to zadziałało?
PositiveGuy
12
-1: Mogę również potwierdzić, że użycie elementu lokalizacji, jak pokazano powyżej, NIE działa.
Adrian Grigore
23

Włożyłem wszystko w:

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

z wyjątkiem: <configSections/>, <connectionStrings/>i <runtime/>.

Są przypadki, w których nie chcemy dziedziczyć niektórych sekcji z <configSections />, ale nie możemy wstawić <section/>tagu <location/>, więc musimy utworzyć<secionGroup /> i umieścić nasze niechciane sekcje w tej grupie. Grupy sekcji można później wstawić do znacznika lokalizacji.

Więc musimy to zmienić:

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

W:

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

<location path="." inheritInChildApplications="false">
    <myNotInheritedSections>
        <unwantedSection />
    </myNotInheritedSections>
</location>
cryss
źródło
Mam niestandardowe sekcje
Kiquenet
To rozwiązało mój problem. Miałem aplikację internetową z EF6.1.3 i podrzędną aplikację internetową z EF5. Uaktualnienie dziecięcej aplikacji internetowej nie wchodziło w grę, więc musiałem użyć tej techniki, aby zarówno działać, jak i działało. Poszedłem za tym przykładem, przechodząc myNotInheritedSectionsdo sekcji ef6Privatei unwantedSectionjest entityFramework.
Mohamed Nuur
Czy możesz pomóc, dlaczego mój nie działa, oto mój kod <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

Otrzymaliśmy błąd związany z tym po ostatnim wydaniu kodu w jednym z naszych środowisk programistycznych. Mamy aplikację, która jest dzieckiem innej aplikacji. Ten związek działał dobrze przez LATA aż do wczoraj.

Problem:
otrzymywaliśmy żółty błąd śledzenia stosu z powodu wprowadzenia zduplikowanych kluczy. Dzieje się tak, ponieważ zarówno plik web.config dla aplikacji podrzędnej, jak i nadrzędnej miał ten klucz. Ale to istniało przez wiele lat bez zmian. Dlaczego nagle teraz jest to problem?

Rozwiązanie:
nigdy nie stanowiło to problemu, ponieważ klucze AND były zawsze takie same. Wczoraj zaktualizowaliśmy nasze parametry połączenia SQL, aby uwzględnić nazwę aplikacji w parametrach połączenia. To sprawiło, że struna była wyjątkowa i nagle zaczęła zawodzić.

Nie szukając dokładnej przyczyny takiego stanu rzeczy, muszę założyć, że gdy aplikacja podrzędna dziedziczy wartości z pliku web.config nadrzędnego, ignoruje identyczne pary klucz / wartość.

Udało nam się to rozwiązać, opakowując parametry połączenia w ten sposób

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

Edycja: zapomniałem wspomnieć, że dodałem to w web.config RODZICÓW. Nie musiałem modyfikować pliku web.config dziecka.

Dzięki za pomoc wszystkim, uratowaliśmy nasze tyłki.

Kenneth Garza
źródło
6

Jeśli (jak rozumiem) próbujesz całkowicie zablokować dziedziczenie w konfiguracji internetowej swojej aplikacji podrzędnej, sugeruję unikanie używania tagu w pliku web.config. Zamiast tego utwórz nową pulę aplikacji i edytuj plik applicationHost.config (znajdujący się w% WINDIR% \ System32 \ inetsrv \ Config i% WINDIR% \ SysWOW64 \ inetsrv \ config). Musisz tylko znaleźć wpis dla swojej puli aplikacji i dodać atrybut enableConfigurationOverride="false"jak w poniższym przykładzie:

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

Pozwoli to uniknąć dziedziczenia konfiguracji w aplikacjach obsługiwanych przez MyAppPool.

Matteo

Matteo Sganzetta
źródło
1
MSDN mówi „Gdy fałsz, wszystkie ustawienia w plikach Web.config zostaną zignorowane dla tej puli aplikacji”, a to po prostu nie wygląda na to, co myślisz, że to oznacza. Bardzo bym chciał, żeby to była właściwa odpowiedź, ale po prostu nie mogę jej uruchomić. Wydaje mi się, że to ustawienie oznacza `` całkowite zablokowanie lokalnego pliku web.config dla tej puli aplikacji ''
Simon_Weaver
Więc w zasadzie aplikacje w tej puli aplikacji mają działać bez pliku web.config? Rozumiem, że „ignorowany plik web.config” to ten w folderze głównym. Użyłem go z powodzeniem kilka razy. Upewnij się, że aplikacja podrzędna nie zależy od konfiguracji w katalogu głównym web.config (spróbuj uruchomić aplikację podrzędną w oddzielnym folderze głównym).
Matteo Sganzetta
1
Możesz także sprawdzić metodę nr 2 na tej stronie, chociaż nie testowałem jej iislogs.com/steveschofield/2009/09/20/ ...
Matteo Sganzetta
moja aplikacja podrzędna jest w rzeczywistości dokładną kopią aplikacji nadrzędnej. Chcę mieć możliwość umieszczenia, /previewaby ludzie mogli przetestować nową wersję przed uruchomieniem. Każdy zawsze sugeruje <location>rozwiązanie tego problemu, więc byłem bardzo podekscytowany, aby przeczytać Twój post. Jednak skarży się The entry 'default' has already been added.na wpis konfiguracji związany z AppFabric, nawet gdy używamenableConfigurationOverride="false"
Simon_Weaver
również jeśli enableConfigurationOverride="false"
ustawię
1

Otrzymujemy błędy dotyczące zduplikowanych dyrektyw konfiguracyjnych w jednej z naszych aplikacji. Po zbadaniu wygląda na to, że jest to spowodowane tym problemem .

W skrócie, nasza główna witryna sieci Web to ASP.NET 3.5 (czyli 2.0 z dodanymi określonymi bibliotekami), a my mamy aplikację podrzędną, która jest ASP.NET 4.0.

Dziedziczenie pliku web.config powoduje, że podaplikacja ASP.NET 4.0 dziedziczy plik web.config nadrzędnej aplikacji ASP.NET 3.5.

Jednak globalny (lub „główny”) plik web.config aplikacji ASP.NET 4.0, który znajduje się w C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ web.config i C: \ Windows \ Microsoft. NET \ Framework64 \ v4.0.30319 \ Config \ web.config (w zależności od twojej bitness) już zawiera te sekcje konfiguracyjne.

Następnie aplikacja ASP.NET 4.0 próbuje scalić ze sobą główny ASP.NET 4.0 web.config i nadrzędny web.config (ten dla aplikacji ASP.NET 3.5) i działa jako duplikaty w węźle.

Jedynym rozwiązaniem, jakie udało mi się znaleźć, jest usunięcie sekcji konfiguracyjnych z nadrzędnego pliku web.config, a następnie jednego z nich

  1. Ustal, że nie potrzebujesz ich w aplikacji root, a jeśli tak
  2. Uaktualnij aplikację nadrzędną do ASP.NET 4.0 (aby uzyskała dostęp do configSections katalogu głównego web.config)
Josh
źródło