2009-04-23 10 views
131

Próbuję dodaćUnikaj web.config dziedziczenia u dziecka aplikacji internetowych przy użyciu inheritInChildApplications

<location inheritInChildApplications="false"> 

do web.config mój rodzic aplikacji internetowych, ale nie wydaje się działać.

moich rodziców web.config posiada:

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

Moje dziecko aplikacja internetowa jest skonfigurowana jako aplikacji w IIS, a dziedziczy od jednostki dominującej web.config który jest przyczyną problemów.

Gdzie dokładnie mam umieść

<location inheritInChildApplications="false"> 

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

+19

Drogi Microsoft - czy możemy po prostu '' –

+14

Drogi Microsoft: Albo po prostu całkowicie wyłącz automatyczne dziedziczenie. Nie mogę na całe życie pomyśleć o sytuacji, w której * chciałbym *, aby aplikacja podrzędna dziedziczyła plik Web.config jej rodzica. –

Odpowiedz

176

jako komentujących na poprzedniej odpowiedzi wspomniano, nie można po prostu dodać linię ...

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

... tuż poniżej <configuration>. Zamiast tego należy owinąć 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> 

Podczas <clear /> może pracować dla niektórych odcinkach konfiguracyjnych, istnieją pewne, że zamiast wymagać dyrektywę <remove name="...">, a jeszcze inni nie wydają się wspierać albo. W takich sytuacjach prawdopodobnie warto ustawić inheritInChildApplications="false".

+3

Czy można to zrobić na odwrót? Uważam to za dziwne, że muszę zaktualizować rodzica, kiedy to dziecko decyduje, czy ustawienia powinny zostać odziedziczone, czy nie. – nabeelfarid

+0

@nabeelfarid - Całkowicie się zgadzam. Jeśli masz blog typu wordpress w aplikacji .NET ze złożonym web.config, może to być ogromny problem z usunięciem go lub zapobieganiem dziedziczeniu. Myślę, że cały system "lokalizacji" jest zaprojektowany bardziej pod kątem bezpieczeństwa dla współdzielonych hostów, dla których większość ludzi znajduje się tutaj pod kątem kompatybilności –

+0

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, który mówi "QA" i zawiera takie same pliki usług WCF, jak w SIT, w tym web.config, ale kierujący bazę danych do QA. Kiedy wywołuję usługę wcf wewnątrz folderu "QA", pobiera ona połączenie tylko z konfiguracji nadrzędnej (nawet daję znacznik ). Daj mi znać, jaki byłby problem. – superachu

56

To musi się udać bezpośrednio w węźle korzeń <configuration> i trzeba ustawić ścieżkę tak:

<?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 config dziecka gdziekolwiek don nie chcę odziedziczyć. Więc jeśli nie chce dziedziczyć ciągów połączenia nadrzędnego config za byś zrobił coś takiego:

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

Otrzymuję ten błąd "Sekcja konfiguracji" configSections "nie może zostać odczytana, ponieważ brakuje jej deklaracji sekcji" w pliku moich rodziców web.config. – Blankman

+0

Czy możesz umieścić swoją konfigurację z elementem ? Sprawdziłbym również moją edycję i zobaczę, czy może być lepszym podejściem do tego, co próbujesz zrobić. –

+5

to nie działa, gdy umieścisz go tuż pod . Możesz zawinąć, powiedzmy, węzeł , ale nie możesz po prostu umieścić go w katalogu głównym. – PositiveGuy

1

Otrzymujemy błędy dotyczące duplikatów dyrektyw konfiguracyjnych w jednej z naszych aplikacji. Po przeprowadzeniu dochodzenia wygląda na to, że jest to spowodowane this issue.

W skrócie, naszą główną witryną jest ASP.NET 3.5 (która jest 2.0 z dodanymi konkretnymi bibliotekami), a mamy podtekst aplikacji ASP.NET 4.0.

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

Jednak aplikacja web.config aplikacji ASP.NET 4.0 jest globalna (lub "root"), która znajduje się w katalogu 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), zawiera już te sekcje konfiguracji.

Aplikacja ASP.NET 4.0 próbuje następnie połączyć główny plik ASP.NET 4.0 web.config i macierzysty plik web.config (ten dla aplikacji ASP.NET 3.5) i uruchamia się w duplikatach w węźle .

Jedynym rozwiązaniem udało mi się znaleźć to, aby usunąć sekcje konfiguracyjne z pliku web.config macierzystej, a następnie albo

  1. Ustal, że nie trzeba ich w aplikacji korzeni, lub jeśli nie
  2. Uaktualnienie aplikacji nadrzędnej na ASP.NET 4.0 (tak zyskuje dostęp do configSections korzenia web.config'S)
7

Byliśmy otrzymuję błąd związany z tym po niedawnym wydaniu kodu do jednego naszych środowisk programistycznych. Mamy aplikację, która jest dzieckiem innej aplikacji. Ta relacja działa dobrze przez LATA do wczoraj.

Problem:
Otrzymaliśmy błąd śledzenia stosu żółtego ze względu na wprowadzanie powtarzających się kluczy. Jest tak dlatego, że zarówno web.config dla aplikacji podrzędnych, jak i nadrzędnych posiadały ten klucz. Ale istniało to przez wiele lat w ten sposób bez żadnych zmian. Dlaczego teraz jest to nagły problem?

Rozwiązanie:
Powodem, dla którego nigdy nie było problemu jest to, że klucze I wartości były zawsze takie same. Wczoraj zaktualizowaliśmy nasze ciągi połączeń SQL, aby uwzględnić nazwę aplikacji w ciągu połączenia. To spowodowało, że sznur był wyjątkowy i nagle zaczął zawieść.

Bez przeprowadzania jakichkolwiek badań dokładnej przyczyny tego, muszę założyć, że gdy aplikacja podrzędna dziedziczy wartości web.config rodziców, ignoruje identyczne pary klucz/wartość.

Udało nam się go rozwiązać przez zawijania ciąg połączenia jak to

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

EDIT: Zapomniałam wspomnieć, że dodałem to w web.config rodziców. Nie musiałem modyfikować web.config dziecka.

Dzięki za pomoc dla każdego, uratowaliśmy nasze tyłki.

4

Jeśli (o ile rozumiem) próbujesz całkowicie zablokować dziedziczenie w konfiguracji sieciowej aplikacji podrzędnej, sugeruję, aby unikać używania tego znacznika w pliku web.config. Zamiast tego utwórz nową aplikację i edytuj plik applicationHost.config (znajdujący się w% WINDIR% \ System32 \ inetsrv \ Config i% WINDIR% \ SysWOW64 \ inetsrv \ config). Po prostu trzeba znaleźć wejście dla apppool 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> 

To pozwoli uniknąć dziedziczenia konfiguracji w aplikacji obsługiwanych przez MyAppPool.

Matteo

+1

MSDN mówi "Kiedy false, wszystkie ustawienia w plikach Web.config będą ignorowane puli aplikacji "i to po prostu nie wydaje się być tym, co według ciebie oznacza. Uwielbiam to, aby była właściwą odpowiedzią, ale po prostu nie mogę jej uruchomić. Wygląda mi to prawie tak, jak to ustawienie oznacza "całkowicie nie zezwalaj na lokalny web.config dla tego apppool ' –

+0

Więc w zasadzie aplikacje w tej aplikacji Pula powinna działać bez pliku web.config? Rozumiem, że "ignorowany web.config" jest tym z folderu głównego. Użyłem tego kilka razy z powodzeniem. Upewnij się, że aplikacja podrzędna nie zależy od konfiguracji w głównym pliku web.config (spróbuj uruchomić aplikację podrzędną w oddzielnym folderze głównym). –

+1

Możesz również sprawdzić metodę # 2 na tej stronie, chociaż jej nie przetestowałem http://iislogs.com/steveschofield/2009/09/20/control-web-config-inheritance-with-iis-7- asp-net-options/ –

15

kładę wszystko na:

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

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

Istnieją pewne przypadki, kiedy nie chcemy dziedziczyć pewne secions z <configSections />, ale nie możemy umieścić <section/> tag w <location/>, więc musimy stworzyć <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> 

Into:

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

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

Mam ** niestandardowe sekcje ** – Kiquenet

+0

To rozwiązało mój problem. Miałem aplikację internetową z EF6.1.3 i aplikacją internetową dla dzieci z EF 5. Aktualizacja aplikacji internetowej dla dzieci nie wchodziła w rachubę, więc musiałem użyć tej techniki, aby pracować i wszystko działało.Zrobiłem ten przykład, zmieniając 'myNotInheritedSections' na' ef6Private' a "unwantedSection" to sekcja "entityFramework". –

Powiązane problemy