आप रनटाइम पर web.config appSettings को कैसे संशोधित करते हैं?


84

मैं रनटाइम पर web.config appSettings मानों को संशोधित करने के तरीके पर उलझन में हूं। उदाहरण के लिए, मैं इस appSettings अनुभाग है:

<appSettings>
  <add key="productspagedesc" value="TODO: Edit this default message" />
  <add key="servicespagedesc" value="TODO: Edit this default message" />
  <add key="contactspagedesc" value="TODO: Edit this default message" />
  <add key="aboutpagedesc" value="TODO: Edit this default message" />
  <add key="homepagedesc" value="TODO: Edit this default message" />
 </appSettings>

मान लीजिए, मैं रनटाइम के दौरान "होमपीडेस" कुंजी को संशोधित करना चाहता हूं। मैंने कॉन्फ़िगरेशन प्रबंधक और WebConfigurationManager स्थिर कक्षाओं की कोशिश की, लेकिन सेटिंग्स "केवल पढ़ने के लिए" हैं। मैं क्रम में appSettings मूल्यों को कैसे संशोधित करूं?

अद्यतन: ठीक है, तो यहाँ मैं 5 साल बाद हूँ। मैं यह बताना चाहूंगा कि अनुभव ने मुझे बताया है, हमें किसी भी कॉन्फ़िगरेशन को नहीं डालना चाहिए जो जानबूझकर web.config फ़ाइल में रनटाइम पर संपादन योग्य है, लेकिन इसके बजाय हमें इसे एक अलग XML फ़ाइल में डालना चाहिए जैसे कि उपयोगकर्ताओं में से एक ने नीचे टिप्पणी की थी। इससे App को पुनरारंभ करने के लिए web.config फ़ाइल के किसी भी संपादन की आवश्यकता नहीं होगी, जिसके परिणामस्वरूप नाराज उपयोगकर्ता आपको कॉल करेंगे।


यहाँ एक अच्छा लिंक है जो अच्छी तरह से रनटाइम पर web.config को संशोधित करने और अनुप्रयोग में इसके प्रभाव के बारे में बताता है। http://aspdotnethacker.blogspot.com/2010/05/modify-webconfig-file-at-runtime.html

5
@ user330004 आपके द्वारा दिया गया लिंक अब मान्य नहीं है
McArthey

संग्रहीत संस्करण को खोजने में केवल कुछ सेकंड लगते हैं !
स्टुअर्ट

जवाबों:


84

आपको उपयोग करने की आवश्यकता है WebConfigurationManager.OpenWebConfiguration() : उदाहरण के लिए:

Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")
myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text
myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text
myConfiguration.Save()

मुझे लगता है कि आपको AllowLocation को machine.config में सेट करना पड़ सकता है । यह एक बूलियन मान है जो इंगित करता है कि क्या तत्व का उपयोग करके व्यक्तिगत पृष्ठों को कॉन्फ़िगर किया जा सकता है। यदि "अनुमति" गलत है, तो इसे व्यक्तिगत तत्वों में कॉन्फ़िगर नहीं किया जा सकता है।

अंत में, यदि आप IIS में अपना एप्लिकेशन चलाते हैं और विज़ुअल स्टूडियो से अपना परीक्षण नमूना चलाते हैं तो इससे फ़र्क पड़ता है। ASP.NET प्रक्रिया पहचान IIS खाता, ASPNET या नेटवर्क सेवा (IIS संस्करण पर निर्भर करता है) है।

ASPNET या NETWORK सेवा प्रदान करने की आवश्यकता हो सकती है, उस फ़ोल्डर पर पहुँच को संशोधित करें जहाँ web.config रहता है।


1
प्रतिक्रिया के लिए धन्यवाद मिच। आपने मेरे सवाल का जवाब दिया। मैंने जो किया था, मैं VS 2008 में प्रशासक के रूप में चला था और सब कुछ ठीक चल रहा था।
jerbersoft

शायद दूसरों के लिए स्पष्ट (मेरे लिए नहीं), यह जवाब, साथ ही साथ अमीन की जो कार्यात्मक रूप से एक ही है, वास्तव में आपकी भौतिक web.config फ़ाइल को ओवरराइट करता है, केवल विशिष्ट रनिंग इंस्टेंस के लिए मेमोरी में सेटिंग को ओवरराइड नहीं करता है।
k3davis

24

सामान्यतया web.config को बदलने से एप्लिकेशन पुनः आरंभ होता है।

यदि आपको वास्तव में अपनी सेटिंग्स को संपादित करने के लिए अपने आवेदन की आवश्यकता है, तो आपको सेटिंग्स को अलग करने या संपादन योग्य सेटिंग्स के साथ एक xml फ़ाइल बनाने जैसे एक अलग दृष्टिकोण पर विचार करना चाहिए।


1
हाय, प्रतिक्रिया के लिए धन्यवाद। लेकिन यह "कॉन्फ़िगरेशन" वर्ग है जिसमें "सहेजें" फ़ंक्शन है। क्या आपको वास्तव में सक्रिय होने के लिए नई सेटिंग्स के लिए ऐप को पुनरारंभ करना होगा?
jerbersoft

4
Web.config को बदलना स्वचालित रूप से एप्लिकेशन पुनरारंभ को ट्रिगर करता है।
माइक कोल

1
वेब.कॉन्फ़िग को गतिशील रूप से बदलने की अनुशंसा नहीं की जानी चाहिए। मैं एक (xml) फ़ाइल में मान संग्रहीत करना पसंद करूंगा।
दीपक मिश्रा

क्या कोई समझा सकता है कि आवेदन को फिर से शुरू करना बुरा क्यों है और कई लोग एक अलग फ़ाइल में विशेषता को स्थानांतरित करने की सलाह देते हैं?
बेन

1
@ पता है - मुझे पता है कि यह कुछ महीने है, लेकिन सिर्फ मामले में - ऐप को पुनरारंभ करने का मतलब होगा कि आपके ऐप में लॉग इन करने पर कोई भी व्यक्ति स्वचालित रूप से लॉग आउट हो जाएगा और सबसे अधिक संभावना एक त्रुटि का सामना करेगी। (विभिन्न परिदृश्य जैसे वेब फ़ार्म के बावजूद ...)। नाराज़ उपयोगकर्ता संपर्क समर्थन, समर्थन संपर्क आप आदि आदि ...
Fetchez la vache

24

और यदि आप आवेदन को फिर से शुरू करने से बचना चाहते हैं, तो आप appSettingsअनुभाग से बाहर जा सकते हैं :

<appSettings configSource="Config\appSettings.config"/>

एक अलग फ़ाइल के लिए। और के संयोजन मेंConfigurationSaveMode.Minimal

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.Save(ConfigurationSaveMode.Minimal);

आप appSettingsएप्लिकेशन पुनः आरंभ किए बिना और सामान्य ऐपसेटिंग अनुभाग की तुलना में किसी भिन्न प्रारूप वाली फ़ाइल का उपयोग करने की आवश्यकता के बिना विभिन्न सेटिंग्स के लिए स्टोर के रूप में अनुभाग का उपयोग करना जारी रख सकते हैं ।


21

2012 यह इस परिदृश्य के लिए एक बेहतर समाधान है ( दृश्य स्टूडियो 2008 के साथ परीक्षण किया गया ):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
config.AppSettings.Settings.Remove("MyVariable");
config.AppSettings.Settings.Add("MyVariable", "MyValue");
config.Save();

अद्यतन 2018 =>
बनाम 2015 में परीक्षण किया गया - Asp.net MVC5

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
config.Save();

अगर यू चेकिंग एलिमेंट मौजूद है, तो इस कोड का उपयोग करें:

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
if (config.AppSettings.Settings["MyVariable"] != null)
{
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
}
else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); }
config.Save();

क्या आप थोड़ा विस्तार कर सकते हैं कि यह बेहतर क्यों है? मुझे पता है कि configSection सामान कभी-कभी थोड़ा मुश्किल होता है।
जूलियागॉन

1
यह कोड छोटा और अधिक समझने योग्य है! कम से कम मेरे लिए।
अमीन गदेरी

3
ओह, यह व्यक्तिगत स्वाद की वजह से है, तो मुझे वास्तव में लगा कि यह किसी तरह से तार्किक रूप से अलग है। मैं इस मामले में आपसे बहुत असहमत हूं, हालांकि वास्तव में कारणों की एक गुच्छा के लिए: पहला इसलिए क्योंकि आपको एक ही कुंजी को दो बार निर्दिष्ट करना है, दूसरा क्योंकि आप जो कर रहे हैं वह शब्दार्थ वास्तव में जरूरत से ज्यादा अलग है ('अपडेट' बनाम 'निकालें-> जोड़ें ') और तीसरा, क्योंकि कोड वास्तव में लंबा है (सुनिश्चित नहीं है कि आप यहां क्यों अन्यथा बात करते हैं) और गलतियों के लिए खुले हैं। इसके अलावा, क्या होगा अगर किसी कारण से आपका कोड कॉल के बीच विफल हो जाता है? मुझे लगता है कि आपका आवेदन वहां से टूट गया है।
जुलीगॉन

2
यह कोड MyVariable के लिए किसी भी टिप्पणी को मिटा देता है।
ब्लेगस

हाँ बिल्कुल ! यह कोड कोड सभी चर को फिर से लिखा जा सकता है, लेकिन यह काम करता है। लेकिन मैं इसे यूज़ करने की सलाह नहीं देता, जब यू ने कमेंट कोड का इस्तेमाल किया। धन्यवाद।
अमीन गदरी

14

मुझे पता है कि यह सवाल पुराना है, लेकिन मैं अपने वास्तविक दुनिया के अनुभव के साथ संयुक्त ASP.NET \ IIS दुनिया में वर्तमान स्थिति के आधार पर एक उत्तर पोस्ट करना चाहता था।

मैंने हाल ही में अपनी कंपनी में एक परियोजना की शुरुआत की, जहाँ मैं एक केंद्रीय स्थान में हमारे web.config फ़ाइलों में सभी एप्लिकेशन और कनेक्शन सेटिंग्स को समेकित और प्रबंधित करना चाहता था। मैं एक दृष्टिकोण को आगे बढ़ाना चाहता था, जहां हमारी कॉन्फ़िगरेशन सेटिंग्स ज़ूकिपर में उस प्रोजेक्ट की परिपक्वता और स्थिरता के कारण संग्रहीत थीं। इस तथ्य का उल्लेख नहीं है कि चिड़ियाघरकीपर एक विन्यास और क्लस्टर प्रबंधन अनुप्रयोग डिज़ाइन कर रहा है।

परियोजना के लक्ष्य बहुत सरल थे;

  1. चिड़ियाघर के साथ संवाद करने के लिए ASP.NET प्राप्त करें
  2. Global.asax में, Application_Start - ZooKeeper से web.config सेटिंग खींचें।

चिड़ियाघर कीपर से बात करने के लिए ASP.NET प्राप्त करने के तकनीकी टुकड़े को पारित करने पर, मैंने जल्दी से पाया और निम्नलिखित कोड के साथ एक दीवार को मारा;

ConfigurationManager.AppSettings.Add(key_name, data_value)

उस कथन ने सबसे अधिक तार्किक अर्थ दिया जब से मैं appSettings संग्रह में नई सेटिंग्स को जोड़ना चाहता था। हालाँकि, जैसा कि मूल पोस्टर (और कई अन्य) में उल्लेख किया गया है, यह कोड कॉल रिटर्न-ओनली बताते हुए एक त्रुटि देता है।

थोड़ा शोध करने और सभी विभिन्न पागल तरीकों को देखने के बाद लोगों ने इस समस्या के आसपास काम किया, मैं बहुत निराश था। आदर्श परिदृश्य से कमतर दिखने के लिए हार मानने या बसने के बजाय, मैंने कुछ खो जाने और खो जाने का फैसला किया।

थोड़ा परीक्षण और त्रुटि के साथ, मैंने पाया कि निम्नलिखित कोड वही होगा जो मैं चाहता था;

ConfigurationManager.AppSettings.Set(key_name, data_value)

कोड की इस पंक्ति का उपयोग करते हुए, अब मैं अपने Application_Start में ZooKeeper से सभी 85 ऐपसेटिंग कुंजी लोड करने में सक्षम हूं।

वेब में परिवर्तन के बारे में सामान्य बयानों के संबंध में। IIS रीसायकल को ट्रिगर करने के लिए, मैंने पर्दे के पीछे की स्थिति की निगरानी करने के लिए निम्नलिखित ऐपपूल सेटिंग्स को संपादित किया;

appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True

सेटिंग्स के उस संयोजन के साथ, यदि यह प्रक्रिया एक ऐप्पल रीसायकल का कारण बनती है, तो एक इवेंट लॉग प्रविष्टि दर्ज की जानी चाहिए, जो यह नहीं थी।

यह मुझे निष्कर्ष निकालता है कि यह संभव है, और वास्तव में सुरक्षित है, एक केंद्रीकृत भंडारण माध्यम से एक एप्लिकेशन सेटिंग्स को लोड करने के लिए।

मुझे उल्लेख करना चाहिए कि मैं विंडोज 7 पर IIS7.5 का उपयोग कर रहा हूं। Win2012 पर IIS8 को कोड तैनात किया जाएगा। इस उत्तर परिवर्तन के बारे में कुछ भी करना चाहिए, मैं इस उत्तर को तदनुसार अपडेट करूंगा।


इसने शायद मुझे कुछ ही घंटे बचाए। बहुत बहुत धन्यवाद!
ड्रू डेलानो

4

जो सीधे मुद्दे पर पसंद करता है,

अपने विन्यास में

    <appSettings>

    <add key="Conf_id" value="71" />

  </appSettings>

आपके कोड में (c #)

///SET
    ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue");
      ///GET              
    string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString();

0

इसे इस्तेमाल करे:

using System;
using System.Configuration;
using System.Web.Configuration;

namespace SampleApplication.WebConfig
{
    public partial class webConfigFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Helps to open the Root level web.config file.
            Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~");
            //Modifying the AppKey from AppValue to AppValue1
            webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString";
            //Save the Modified settings of AppSettings.
            webConfigApp.Save();
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.