InheritInChildApplications का उपयोग करके चाइल्ड वेब एप्लिकेशन में web.config इनहेरिटेंस से बचें


153

मैं जोड़ने की कोशिश कर रहा हूं

<location inheritInChildApplications="false">

मेरे पैरेंट वेब एप्लिकेशन के web.config पर यह काम नहीं करता है।

मेरे माता-पिता का web.configहै:

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

मेरा बच्चा वेब एप्लिकेशन IIS में एक एप्लिकेशन के रूप में सेटअप है, और माता-पिता से विरासत में मिला है web.configजो समस्याओं का कारण बन रहा है।

मुझे वास्तव में कहां रखना चाहिए

<location inheritInChildApplications="false">

इसलिए यह सभी विभिन्न web.config सेटिंग्स को अनदेखा करता है?

जवाबों:


203

पिछले उत्तर के लिए टिप्पणीकारों के रूप में, आप बस लाइन नहीं जोड़ सकते हैं ...

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

... बस नीचे <configuration>। इसके बजाय, आपको व्यक्तिगत web.config अनुभागों को लपेटने की आवश्यकता है जिसके लिए आप विरासत को अक्षम करना चाहते हैं। उदाहरण के लिए:

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

हालांकि <clear />कुछ कॉन्फ़िगरेशन अनुभागों के लिए काम कर सकते हैं, कुछ ऐसे हैं जिनके बजाय एक <remove name="...">निर्देश की आवश्यकता होती है , और अभी भी दूसरों को समर्थन करने के लिए प्रतीत नहीं होता है। इन स्थितियों में, शायद इसे सेट करना उचित है inheritInChildApplications="false"


11
क्या यह संभव है कि इसे दूसरे तरीके से किया जाए? मुझे यह अजीब लगता है कि मुझे माता-पिता को अपडेट करना होगा, जब वह बच्चा होता है जो तय करता है कि सेटिंग्स विरासत में मिलनी चाहिए या नहीं।
nabeelfarid

@nabeelfarid - मैं पूरी तरह से सहमत हूं। यदि आपके पास एक .NET वेब के अंदर एक जटिल web.config के साथ एक वर्डप्रेस ब्लॉग है, तो इसे बाहर निकालने या विरासत को रोकने के साथ काम करने में बहुत बड़ा दर्द हो सकता है। मुझे लगता है कि पूरी 'लोकेशन' प्रणाली को साझा मेजबानों के लिए सुरक्षा के इर्द-गिर्द तैयार किया गया है कि संगतता के मुद्दों के लिए ज्यादातर लोग खुद को यहां पा रहे हैं
साइमन_वेअर

यह मेरे लिए काम नहीं करता है? कोई विचार? मेरे पास एक wcf सेवा है, जिसमें SIT डेटाबेस कनेक्शन में पैरेंट कॉन्फिगर सेट है। मेरे पास उसी सेवा में एक और फ़ोल्डर है जो "क्यूए" कहता है और इसमें वही WCF सेवा फाइलें हैं जैसे कि SIT में web.config सहित लेकिन क्यूए के लिए डेटाबेस को इंगित करता है। जब मैं "क्यूए" फ़ोल्डर के अंदर wcf सेवा को कॉल करता हूं, तो यह केवल माता-पिता के कॉन्फ़िगरेशन से कनेक्शन लेता है (यहां तक ​​कि मैं <स्थान) "टैग" देता हूं। कृपया मुझे बताएं कि समस्या क्या होगी।
सुपरचू

@NickCecil मैं IIS 6 में इसे कैसे प्राप्त करूं? तत्व के inheritInChildApplicationsलिए मान्य पैरामीटर के रूप में स्वीकार नहीं किया जा रहा <location />है। मेरी वेबसाइट SharePoint (2007) चला रही है। मैंने इस वेबसाइट के अंतर्गत एक वर्चुअल डायरेक्टरी में एक एप्लिकेशन बनाया, जिसका प्रबंधन अपने स्वयं के एप्लीकेशन पूल द्वारा किया गया। फिर भी, मैं SharePoint के कॉन्फ़िगरेशन और इस एप्लिकेशन के बीच टकराव का सामना कर रहा हूं। देखें इस सवाल का मैं सर्वर दोष में तैनात।
वेब यूजर

1
मेरा आवेदन जो मैंने एक वेब साइट के बच्चे के रूप में बनाया था, वह अभी भी मूल वेबसाइट से DLL लोड करना चाहता है। जाहिर है, मैं <location>रनटाइम के लिए उपयोग नहीं कर सकता ...
फ्रांसिस डुकरमे

65

इसे सीधे रूट <configuration>नोड के तहत जाने की जरूरत है और आपको इस तरह से एक रास्ता तय करना होगा:

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

कॉन्फ़िगरेशन इनहेरिटेंस को संभालने का एक बेहतर तरीका <clear/>यह है कि आप जहाँ भी वारिस नहीं करना चाहते हैं, वहां बच्चे के कॉन्फिगरेशन का उपयोग करें । तो अगर आप माता-पिता के कनेक्शन के तार को विरासत में नहीं लेना चाहते हैं तो आप कुछ इस तरह से काम करेंगे:

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

17
मुझे यह त्रुटि मिलती है "कॉन्फ़िगरेशन अनुभाग 'कॉन्फ़िगरेशन' को पढ़ा नहीं जा सकता क्योंकि यह मेरे माता-पिता web.config फ़ाइल में एक खंड घोषणा" याद आ रही है।
ब्लेंकमैन

क्या आप इसमें अपना स्थान <तत्व> तत्व के साथ कॉन्फ़िगर कर सकते हैं? मैं अपना संपादन भी देखूंगा और देखूंगा कि क्या आप करने की कोशिश कर रहे हैं।
एंड्रयू हरे

6
यह तब काम नहीं करता जब आप इसे <कॉन्फ़िगरेशन> के ठीक नीचे रखते हैं। आप इसे <system.web> नोड कह सकते हैं, लेकिन आप इसे इस तरह मूल में नहीं डाल सकते हैं।
पॉजिटिव जी

यदि आप इसे <कॉन्फ़िगरेशन> के तहत 2 नोड के रूप में डालते हैं, तो आपको "inheritInChildApplications विशेषता घोषित नहीं होती है"। तो यह web.config में उस स्तर पर एक मान्य विशेषता नहीं है। तो आप कैसे कह सकते हैं कि यह काम किया है?
पॉजिटिव जी

12
-1: मैं यह भी पुष्टि कर सकता हूं कि ऊपर दिखाए गए स्थान तत्व का उपयोग करना काम नहीं करता है।
एड्रियन ग्रिगोर

23

मैंने सब कुछ इसमें डाल दिया:

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

सिवाय: <configSections/>, <connectionStrings/>और <runtime/>

ऐसे कुछ मामले हैं, जब हम कुछ सेकेंड्स इनहेरिट नहीं करना चाहते हैं <configSections />, लेकिन हम <section/>टैग नहीं लगा सकते हैं <location/>, इसलिए हमें एक <secionGroup />ग्रुप बनाना होगा और अपने अनचाहे सेक्शन को उस ग्रुप में डालना होगा। अनुभाग समूहों को बाद में एक स्थान टैग में डाला जा सकता है।

इसलिए हमें इसे बदलना होगा:

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

में:

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

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

मेरे पास कस्टम अनुभाग हैं
कीकनेट

इससे मेरी समस्या हल हो गई। मेरे पास EF6.1.3 और बाल वेब ऐप EF5 के साथ एक वेब ऐप था। चाइल्ड वेब ऐप को अपग्रेड करना सवाल से बाहर था, इसलिए मुझे इस तकनीक का उपयोग काम करने के लिए करना पड़ा और इसने काम किया। मैंने इस उदाहरण का अनुसरण किया है, जो अनुभाग में बदल रहा myNotInheritedSectionsहै ef6Privateऔर unwantedSectionहै entityFramework
मोहम्मद नुउर

क्या आप मदद कर सकते हैं कि मेरा काम क्यों नहीं हो रहा है, यहाँ मेरा कोड है <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>
तारांकन चिह्न 8

9

हाल ही में हमारे एक विकास वातावरण में कोड जारी करने के बाद हमें इससे संबंधित एक त्रुटि मिल रही थी। हमारे पास एक एप्लिकेशन है जो दूसरे एप्लिकेशन का एक बच्चा है। यह संबंध कल तक YEARS के लिए ठीक काम कर रहा है।

समस्या:
हमें डुप्लिकेट कुंजियों को दर्ज करने के कारण एक पीले स्टैक ट्रेस त्रुटि हो रही थी। ऐसा इसलिए है क्योंकि बच्चे और माता-पिता के अनुप्रयोगों के लिए दोनों web.config में यह कुंजी थी। लेकिन यह परिवर्तन के बिना इस तरह कई वर्षों के लिए अस्तित्व में था। अब अचानक इसका मुद्दा क्यों?

समाधान:
कारण यह कभी भी समस्या नहीं थी क्योंकि चाबियाँ और मूल्य हमेशा समान थे। कल हमने कनेक्शन स्ट्रिंग में एप्लिकेशन का नाम शामिल करने के लिए हमारे SQL कनेक्शन स्ट्रिंग्स को अपडेट किया। इसने स्ट्रिंग को अद्वितीय बना दिया और सभी अचानक विफल होने लगे।

इसके सटीक कारण पर कोई शोध किए बिना, मुझे यह मानना ​​होगा कि जब बच्चे के आवेदन में माता-पिता web.config मूल्यों को विरासत में मिलते हैं, तो यह समान कुंजी / मूल्य जोड़े की उपेक्षा करता है।

हम कनेक्शन स्ट्रिंग को इस तरह लपेटकर इसे हल करने में सक्षम थे

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

संपादित करें: मैं यह उल्लेख करना भूल गया कि मैंने इसे PARENTS web.config में जोड़ा है। मुझे बच्चे के web.config को संशोधित करने की आवश्यकता नहीं थी।

इस पर मदद के लिए धन्यवाद, हमारे चूतड़ को बचाया।


6

यदि (जैसा कि मैं समझता हूं) आप अपने बच्चे के एप्लिकेशन के वेब कॉन्फिगरेशन में इनहेरिटेंस को पूरी तरह से ब्लॉक करने की कोशिश कर रहे हैं, तो मेरा सुझाव है कि आप web.config में टैग का उपयोग करने से बचें। इसके बजाय एक नया ऐप्पल बनाएँ और ApplicationHost.config फ़ाइल को संपादित करें (% WINDIR% \ System32 \ inetsrv \ config और% WINDIR% \ SysWOW64 \ inetsrv \ config में स्थित)। आपको बस अपने एपपूल के लिए प्रविष्टि ढूंढनी होगी और enableConfigurationOverride="false"निम्नलिखित उदाहरण में विशेषता को जोड़ना होगा :

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

यह MyAppPool द्वारा दिए गए अनुप्रयोगों में कॉन्फ़िगरेशन विरासत से बच जाएगा।

Matteo


1
MSDN का कहना है कि 'गलत होने पर, Web.config फ़ाइलों में सभी सेटिंग्स को इस एप्लिकेशन पूल के लिए नजरअंदाज कर दिया जाएगा' और यह बिलकुल भी ऐसा नहीं लगता कि आप इसका क्या मतलब समझते हैं। मैं इसे सही उत्तर देने के लिए प्यार करता हूँ, लेकिन मैं इसे काम करने के लिए नहीं पा सकता हूँ। यह लगभग मुझे इस तरह दिखता है जैसे इस सेटिंग का अर्थ है 'इस ऐप्पल के लिए एक स्थानीय web.config को पूरी तरह से अलग करना'
Simon_Weaver

तो मूल रूप से इस ऐप पूल के तहत आने वाले एप्लिकेशन बिना web.config फ़ाइल के काम करने वाले हैं? मैं समझता हूं कि रूट फ़ोल्डर में "अनदेखा किया गया web.config" एक है। मैंने इसका कुछ समय सफलतापूर्वक उपयोग किया। सुनिश्चित करें कि चाइल्ड एप्लिकेशन रूट web.config में कॉन्फ़िगरेशन पर निर्भर नहीं करता है (एक अलग रूट फ़ोल्डर में चाइल्ड ऐप चलाने की कोशिश करें)।
मत्तो सग्ग्जेटा

1
आप इस पृष्ठ पर विधि # 2 भी देख सकते हैं, हालांकि मैंने इसे iislogs.com/steveschofield/2009/09/20/… पर
Matteo Sganzetta

मेरा बच्चा आवेदन वास्तव में मूल आवेदन की एक सटीक प्रति है। मैं ऐसा करने में सक्षम होना चाहता हूं /previewताकि लोग इसे लाइव करने से पहले एक नए संस्करण का परीक्षण कर सकें। हर कोई हमेशा <location>इस मुद्दे को ठीक करने के लिए सुझाव देता है इसलिए मैं आपके पोस्ट को पढ़ने के लिए बहुत उत्साहित था। हालाँकि The entry 'default' has already been added., जब मैं इस्तेमाल करता हूं, तब भी यह AppFabric संबंधित कॉन्फ़िगरेशन प्रविष्टि के लिए शिकायत करता हैenableConfigurationOverride="false"
Simon_Weaver

अगर मैं enableConfigurationOverride="false"अपने रूट एप्लिकेशन पर सेट करता हूं तो यह रूट एप्लिकेशन को पूरी तरह से मार देता है और यह काम भी नहीं करेगा :-(
सिमोन_वेर


1

हमें अपने ऐप्स में से एक पर डुप्लिकेट कॉन्फ़िगरेशन निर्देशों के बारे में त्रुटियां हो रही हैं। जांच के बाद ऐसा लग रहा है कि यह इस मुद्दे की वजह से है ।

संक्षेप में, हमारी रूट वेबसाइट ASP.NET 3.5 है (जो कि विशिष्ट पुस्तकालयों के साथ 2.0 है), और हमारे पास एक सबस्पेक्शन है जो ASP.NET 4.0 है।

web.config इनहेरिटेंस ASP.NET 4.0 उप-अनुप्रयोग के कारण पैरेंट ASP3 3.5 अनुप्रयोग की web.config फ़ाइल को इनहेरिट करने का कारण बनता है।

हालाँकि, ASP.NET 4.0 अनुप्रयोग का वैश्विक (या "रूट") web.config, जो C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ web.config और C: \ Windows \ Microsoft पर रहता है। NET \ Framework64 \ v4.0.30319 \ config \ web.config (आपकी बिटनेस के आधार पर), पहले से ही इन कॉन्फ़िगरेशन अनुभागों में शामिल हैं।

ASP.NET 4.0 ऐप फिर रूट ASP.NET 4.0 web.config और पैरेंट web.config (ASP.NET 3.5 ऐप के लिए एक) को एक साथ मर्ज करने की कोशिश करता है, और नोड में डुप्लिकेट में चलता है।

एकमात्र समाधान जो मुझे मिल गया है, वह पैरेंट web.config से कॉन्फिगर वर्गों को हटाना है, और फिर या तो

  1. निर्धारित करें कि आपको अपने रूट एप्लिकेशन में उनकी आवश्यकता नहीं थी, या यदि आप करते हैं
  2. ASP.NET 4.0 के लिए मूल एप्लिकेशन को अपग्रेड करें (इसलिए यह रूट web.config के कॉन्फिगरेशन तक पहुंच प्राप्त करता है)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.