2010-03-03 11 views
5

मैं कार्यावधि में हमारे servicehost की app.config में स्थित connectionstring में डेटाबेस का नाम बदलने और बाद में पुन: प्रारंभ एक और डेटाबेस से कनेक्ट करने के लिए कोशिश कर रहा हूँ के लिए configurationmanager कैश कैसे साफ कर सकते हैं। यह ठीक काम करता है, लेकिन केवल तभी जब एप्लिकेशन कई सेकंड के लिए बंद हो जाता है। कई सेकंड के लिए एप्लिकेशन को बंद करना ConfigManager.Connectionstrings के कैश को साफ़ करना प्रतीत होता है। समस्या यह है कि इस शट डाउन समय के कारण, मैं अपने आवेदन में एप्लिकेशन का उपयोग नहीं कर सकता। रीस्टार्ट()।मैं ConnectionStrings

इस कैशिंग व्यवहार के बारे में अजीब बात यह है कि जब भी मूल्य (दूसरी बार यह अनुरोध किया जाता है उदाहरण में) स्मृति में अद्यतन किया जाता है अद्यतन मूल्य सही ढंग से प्रदर्शित किया जाता है। लेकिन जब एप्लिकेशन को पुनरारंभ किया जाता है तो पुराना मान फिर से उभरता प्रतीत होता है।

व्यवहार को सत्यापित करने के लिए एक नया कंसोल ऐप बनाएं।

 ConfigurationManager.RefreshSection("connectionStrings"); 
     DbConnectionStringBuilder builder = new DbConnectionStringBuilder(); 
     Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     builder.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString; 

     //print initial value 
     Console.WriteLine("initial " + (string)builder["Initial Catalog"]); 

     //change value 
     builder["Initial Catalog"] = "ChangedDatabaseName"; 
     appConfig.ConnectionStrings.ConnectionStrings.Remove("DomainDBConnectionString"); 
     appConfig.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings("DomainDBConnectionString", builder.ConnectionString)); 
     appConfig.ConnectionStrings.SectionInformation.ForceSave = true; 
     appConfig.Save(ConfigurationSaveMode.Full); 
     ConfigurationManager.RefreshSection("connectionStrings"); 

     Console.ReadLine(); 

     DbConnectionStringBuilder builder2 = new DbConnectionStringBuilder(); 
     Configuration appConfig2 = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     builder2.ConnectionString = appConfig.ConnectionStrings.ConnectionStrings["DomainDBConnectionString"].ConnectionString; 
     Console.WriteLine("changed " + (string)builder2["Initial Catalog"]); 

     Console.ReadLine(); 

इस व्यवहार को पुनः करने के लिए एक App.config फ़ाइल

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
    <add name="DomainDBConnectionString" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=InitialDBName;Integrated Security=SSPI;" /> 
    </connectionStrings> 
</configuration> 

जोड़ने तो मुख्य विधि में निम्न कोड जोड़ने के लिए, आप (F5 दबाकर) अनुप्रयोग चलाने के लिए की जरूरत है और बंद करो। बाद में solutionname.exe.config फ़ाइल संशोधित मान के साथ दिखाई देगी। आप आवेदन को दूसरी बार (solutionname.exe doubleclicking द्वारा इस समय) आप व्यवहार में अंतर नोटिस अगर आप अपने आवेदन को समाप्त करने के तुरंत बाद ऐसा करेंगे, या आप कुछ सेकंड प्रतीक्षा की है के बाद समाप्त हो जाता है।

मेरी राय में कॉन्फ़िगरेशन प्रबंधक के कारण कॉन्फ़िगरेशन को फिर से पढ़ा जाना चाहिए। रीफ्रेशसेक्शन ("कनेक्शनस्ट्रिंग्स"); लेकिन apparenatelly यह विज्ञापित के रूप में काम नहीं करता है।

+0

मेरे टैग संपादित करने वाले व्यक्ति को आजमाएं। इसका एएसपी.Net से कोई लेना देना नहीं है। मेरा सर्विसहोस्ट एक कंसोल एप्लीकेशन है। –

+1

पर्याप्त मेला, लेकिन यह अभी भी है।नेट - प्रश्नों को सही ढंग से टैग न करने का जोखिम यह है कि अन्य लोग इसे आपके लिए टैग करेंगे, और उन्हें यह गलत लगेगा :) – skaffman

उत्तर

0

समस्या वास्तव में रहते हैं कि पहली बार है, मैं (सक्षम डीबगर के साथ) दृश्य स्टूडियो से एप्लिकेशन को चलाने लगता है।

अगर मैं बिन/डिबग निर्देशिका से एप्लिकेशन को चलाने के कैशिंग समस्या मौजूद प्रतीत नहीं होता है।

मेरी उत्पादन वातावरण यह मेरी समस्या ठीक हो जाएगी (ताकि दूसरे शब्दों में मेरी समस्या का समाधान होने)। हालांकि यह व्यवहार में अंतर के कारण की मेरी जिज्ञासा को मारता नहीं है।

9

2 बातें:

सबसे पहले आप डिबग मोड आप solutionname.exe.config उपयोग नहीं कर रहे हैं, जब में; आप वास्तव में solutionname.vshost.exe.config का उपयोग कर रहे हैं, इसलिए आपका असंगत व्यवहार क्यों है क्योंकि solutionname.vshost.exe.config फ़ाइल जैसे ही आप एप्लिकेशन को रोकते हैं, मूल संस्करण पर वापस जाते हैं; आपके द्वारा किए गए किसी भी बदलाव को खोना।

सेकेंड ConfigurationManager.RefreshSection("connectionStrings"); कोड की इस पंक्ति को हमेशा उम्मीद के अनुसार काम नहीं करता है। मैंने पाया है कि पैरेंट सेक्शन या सेक्शन ग्रुप को रीफ्रेश करने के लिए कुछ बार बेहतर होता है; इस मामले में "विन्यास" होगा।

तो ConfigurationManager.RefreshSection("configuration");

+0

कॉन्फ़िगरेशन मैनेज। रीफ्रेशसेक्शन ("कॉन्फ़िगरेशन") ने मेरे लिए मदद नहीं की ... मैंने इसके आसपास काम किया कॉन्फ़िगरेशन में परिवर्तनों को सहेजने के बाद एप्लिकेशन। रीस्टार्ट() का उपयोग करना (पीएस नोट कि एप्लिकेशन। रीस्टार्ट() को प्रोग्राम से जोड़ा जाना है। मुख्य() अन्यथा पुनरारंभ करने के बाद आवेदन 2 उदाहरणों में शुरू किया जाएगा) – Prokurors

+0

मैंने सत्यापित किया है कि दुर्भाग्य से यह असंभव है "कॉन्फ़िगरेशन" पर रीफ्रेशसेक्शन चलाएं। – SondreB

संबंधित मुद्दे

 संबंधित मुद्दे