c# - क्या ConfigurationManager.AppSettings[Key] प्रत्येक बार web.config फ़ाइल से पढ़ता है?




asp.net web-config (2)

यह किसी संपत्ति की पहली पहुंच पर कैश हो जाता है, इसलिए जब भी आप किसी मूल्य के लिए पूछते हैं तो यह भौतिक फ़ाइल से नहीं पढ़ता है। यही कारण है कि नवीनतम मान प्राप्त करने के लिए Windows एप (या कॉन्फ़िगर Refresh करें) को पुनरारंभ करना आवश्यक है, और जब आप web.config संपादित करते हैं तो ASP.Net ऐप स्वचालित रूप से पुनरारंभ क्यों होता है। एएसपी . Net को पुनरारंभ करने के लिए कड़ी मेहनत क्यों की जाती है उत्तर में संदर्भों में चर्चा की जाती है जब वेब.कॉन्फिग संशोधित होता है तो एएसपी.NET एप्लिकेशन को पुनरारंभ करने से कैसे रोकें ।

हम ILSpy का उपयोग करके इसे सत्यापित कर सकते हैं और सिस्टम के आंतरिक को देख सकते हैं। ILSpy :

public static NameValueCollection AppSettings
{
    get
    {
        object section = ConfigurationManager.GetSection("appSettings");
        if (section == null || !(section is NameValueCollection))
        {
            throw new ConfigurationErrorsException(SR.GetString("Config_appsettings_declaration_invalid"));
        }
        return (NameValueCollection)section;
    }
}

सबसे पहले, यह वास्तव में ऐसा लगता है कि यह हर बार अनुभाग प्राप्त करेगा। GetSection पर देख रहे हैं:

public static object GetSection(string sectionName)
{
    if (string.IsNullOrEmpty(sectionName))
    {
        return null;
    }
    ConfigurationManager.PrepareConfigSystem();
    return ConfigurationManager.s_configSystem.GetSection(sectionName);
}

यहां महत्वपूर्ण रेखा PrepareConfigSystem() विधि है; यह IInternalConfigSystem द्वारा आयोजित IInternalConfigSystem फ़ील्ड का एक उदाहरण प्रारंभ करता है - ठोस प्रकार ClientConfigurationSystem कॉन्फ़िगरेशन ClientConfigurationSystem

इस लोड के हिस्से के रूप में, Configuration क्लास का एक उदाहरण तत्काल है। यह वर्ग प्रभावी रूप से कॉन्फ़िगरेशन फ़ाइल का एक ऑब्जेक्ट प्रस्तुति है, और क्लाइंट कॉन्फ़िगरेशन सिस्टम द्वारा क्लाइंट कॉन्फ़िगरेशनहोस्ट संपत्ति द्वारा स्थिर क्षेत्र में आयोजित किया जाता है - इसलिए यह कैश किया गया है।

आप निम्न कार्य करके (विंडोज़ फॉर्म या डब्ल्यूपीएफ ऐप में) अनुभव करके इस अनुभव का परीक्षण कर सकते हैं:

  1. अपना ऐप शुरू करना
  2. App.config में एक मान का उपयोग करें
  3. App.config में बदलाव करें
  4. यह देखने के लिए जांचें कि नया मान मौजूद है या नहीं
  5. कॉल ConfigurationManager.RefreshSection("appSettings")
  6. यह देखने के लिए जांचें कि नया मान मौजूद है या नहीं।

असल में, अगर मैं Refresh विधि पर टिप्पणी पढ़ता हूं तो मैं खुद को कुछ समय बचा सकता था :-)

/// <summary>Refreshes the named section so the next time that it is retrieved it will be re-read from disk.</summary>
/// <param name="sectionName">The configuration section name or the configuration path and section name of the section to refresh.</param>

मैं बस सोच रहा हूं कि ConfigurationManager.AppSettings [कुंजी] कैसे काम करता है?

जब भी मुझे एक कुंजी की आवश्यकता होती है तो क्या यह भौतिक फ़ाइल से पढ़ता है?

यदि हां, तो क्या मुझे अपने web.config की सभी ऐप सेटिंग्स को कैश में पढ़ना चाहिए और फिर इसे पढ़ना चाहिए?

या एएसपी.नेट या आईआईएस web.config फ़ाइल को application_startup पर लोड करता है और केवल एक बार।

यह सत्यापित करने के लिए कि क्या प्रत्येक फ़ाइल द्वारा भौतिक फ़ाइल का उपयोग किया जाता है?

अगर मैं web.config बदलता हूं, तो आईआईएस मेरे एप्लिकेशन को पुनरारंभ करता है, इसलिए इसे इस तरह से सत्यापित नहीं किया जा सकता है।

धन्यवाद,


सरल जवाब नहीं है, यह हमेशा फ़ाइल से नहीं पढ़ता है। जैसा कि कुछ ने सुझाव दिया है कि फ़ाइल बदल दी गई है, तो आईआईएस पुनरारंभ करता है लेकिन हमेशा नहीं! अगर आप गारंटी देना चाहते हैं कि आप फ़ाइल से बहुत ही नवीनतम मूल्य पढ़ रहे हैं और कैश नहीं है जिसे आपको इस तरह कुछ कॉल करने की आवश्यकता है:

ConfigurationManager.RefreshSection("appSettings");
string fromFile = ConfigurationManager.AppSettings.Get(key) ?? string.Empty;

और एक उदाहरण मैं अपने कोड में उपयोग करता हूं:

/// ======================================================================================
/// <summary>
/// Refreshes the settings from disk and returns the specific setting so guarantees the
/// value is up to date at the expense of disk I/O.
/// </summary>
/// <param name="key">The setting key to return.</param>
/// <remarks>This method does involve disk I/O so should not be used in loops etc.</remarks>
/// <returns>The setting value or an empty string if not found.</returns>
/// ======================================================================================
private string RefreshFromDiskAndGetSetting(string key)
{
    // Always read from the disk to get the latest setting, this will add some overhead but
    // because this is done so infrequently it shouldn't cause any real performance issues
    ConfigurationManager.RefreshSection("appSettings");
    return GetCachedSetting(key);
}

/// ======================================================================================
/// <summary>
/// Retrieves the setting from cache so CANNOT guarantees the value is up to date but
/// does not involve disk I/O so can be called frequently.
/// </summary>
/// <param name="key">The setting key to return.</param>
/// <remarks>This method cannot guarantee the setting is up to date.</remarks>
/// <returns>The setting value or an empty string if not found.</returns>
/// ======================================================================================
private string GetCachedSetting(string key)
{
    return ConfigurationManager.AppSettings.Get(key) ?? string.Empty;
}

यह आपको बहुत आसानी से चुनने की अनुमति देता है (और जब कोड पढ़ते हैं) चाहे आप हर बार नवीनतम मूल्य प्राप्त कर रहे हों या यदि आप आवेदन शुरू होने पर मूल्य बदलने की अपेक्षा नहीं करते हैं।





configurationmanager