Ç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.
deneyin. Bunun ASP.Net ile ilgisi yok. Servis sunucum bir konsol uygulamasıdır. –
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