2010-03-03 20 views
5

Çalışma zamanında Servicehost öğesinin App.Config öğesinde bulunan connectiontring'de veritabanı adını değiştirmeye çalışıyorum ve daha sonra başka bir veritabanına bağlanarak yeniden başlatın. Bu iyi çalışır, ancak uygulama birden fazla saniye için kapatılmışsa. Uygulamanın birkaç saniye boyunca kapatılması ConfigurationManager.Connectionstrings'in önbelleğini temizliyor gibi görünüyor. Sorun, bu gerekli kapatma süresi nedeniyle, benim uygulamada Application.Restart() kullanamıyorum.Bağlantıları için Configurationmanager önbelleğini nasıl temizleyebilirim

Bu önbelleğe alma davranışıyla ilgili garip olan şey, bellekte değer güncellendiğinde bile (örnekte ikinci kez istenirse) güncellenen değer doğru şekilde görüntülenir. Ancak, uygulama yeniden başlatıldığında, eski değer yeniden ortaya çıkıyor gibi görünüyor.

Davranışı doğrulamak için yeni bir konsol uygulaması oluşturun.

 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(); 

Bu davranışı yeniden oluşturmak için daha sonra Main yöntemi için aşağıdaki kodu ekleyin, bir 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> 

dosya eklemek, siz (F5 vurarak) uygulamayı çalıştırmak için gereken ve kapat onu. daha sonra solutionname.exe.config dosyası değiştirilen değerle görünecektir. Eğer Uygulamayı ikinci kez (solutionname.exe çift tıklayarak bu kez) Eğer uygulama sonlandırmadan hemen sonra bunu yaparsanız davranış fark ya da birkaç saniye bekledim sonra olacak çalıştırırsanız.

Kanaatimce, yapılandırma ConfigurationManager.RefreshSection ("connectionStrings") nedeniyle yeniden okunmalıdır; ancak apparenatelly bu reklamı olarak çalışmaz.

+0

deneyin. Bunun ASP.Net ile ilgisi yok. Servis sunucum bir konsol uygulamasıdır. –

+1

Yeterince adil, ama yine de.net - soruları doğru bir şekilde etiketleme riski, başkalarının sizin için etiketleyeceği ve yanlış yapacağı anlamına gelir :) – skaffman

cevap

0

Sorun ilk defa, uygulamayı görsel stüdyomdan (hata ayıklayıcı etkinken) çalıştırdığım gerçeği gibi görünüyor.

Uygulamayı bin/debug dizininden çalıştırırsam, önbelleğe alma sorunu mevcut görünmüyor.

Üretim ortamım için bu sorunu çözecektir (başka bir deyişle sorunum giderilmiştir). Ancak bu, davranıştaki farklılığın sebebine olan merakımı öldürmez.

9

2 şeyler:

Öncelikle size solutionname.exe.config kullanmıyorsanız ayıklama modunda olduğunda; Aslında solutionname.vshost.exe.config kullanıyorsunuz, bu nedenle tutarsız davranışınız neden solutionname.vshost.exe.config dosyası, uygulamayı durdurduktan sonra orijinal sürüme geri döner; Yaptığınız değişiklikleri kaybetmek.

Saniye kod ConfigurationManager.RefreshSection("connectionStrings"); bu çizgi her zaman beklendiği çalışır olarak. Ebeveyn bölümünü veya bölüm grubunu yenilemek için bazı zamanların daha iyi olduğunu buldum; Bu durumda "yapılandırma" olacaktır.

yani benim etiketler düzenlenmiş adamla ConfigurationManager.RefreshSection("configuration");

+0

ConfigurationManage.RefreshSection ("configuration") bana yardımcı olmadı ... Bu konuda çalıştım Yapılandırma değişiklikleri kaydedildikten sonra Application.Restart() kullanma (Not: Application.Restart(), Program.Main() programından çağrılması gerektiğine dikkat edin. Aksi takdirde, uygulama yeniden başlatıldıktan sonra 2 kez başlatılır.) – Prokurors

+0

Ne yazık ki, bunun imkansız olduğunu doğruladım. RefreshSection'u "configuration" üzerinde çalıştırın. – SondreB

İlgili konular