2008-10-07 17 views
36

Czy ktoś ma to działające w aplikacji internetowej?Ponowne ładowanie konfiguracji bez ponownego uruchamiania aplikacji przy użyciu menedżera konfiguracji ConfigurationManager.RefreshSection

Niezależnie od tego, co robię, wydaje się, że moja sekcja appSettings (przekierowana z web.config przy użyciu pliku appSettings = ". \ Site \ site.config") nie zostanie przeładowana.

Czy jestem skazany na wypadek konieczności ponownego uruchomienia aplikacji? Miałem nadzieję, że ta metoda doprowadzi mnie do bardziej wydajnego rozwiązania.

Aktualizacja:

Przez „przeładowywania” Znaczy orzeźwiające ConfigurationManager.AppSettings bez konieczności całkowicie ponownie uruchomić aplikację ASP.NET i konieczności ponoszenia zwykłe opóźnienie uruchamiania.

Odpowiedz

45

Upewnij się, że przechodzą prawidłową case sensitive wartość RefreshSection, tj

ConfigurationManager.RefreshSection("appSettings"); 
+4

A jak byś odświeżył cały plik? – jjxtra

+0

To działa. Po prostu sprawdź poprawność nazwy sekcji. Na przykład: "connectionStrings". –

+1

Wiem, że jest to stary post, ale nadal: RefreshSection nie jest metodą w klasie WebConfigurationManager. Więc chciałbym wiedzieć, czy ConfigurationManager.RefreshSection odświeży również web.config? – Shashi

-1

Ustawienia aplikacji App.Config są zapisywane w pamięci podręcznej po uruchomieniu aplikacji. Z tego powodu nie sądzę, że będziesz w stanie zmienić te ustawienia bez ponownego uruchamiania aplikacji. Jedną alternatywą, która powinna być całkiem prosta, byłoby stworzenie oddzielnego, prostego pliku konfiguracyjnego XML i radzenie sobie z ładowaniem/buforowaniem/ponownym ładowaniem go samemu.

+0

Co to jest http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.refreshsection.aspx dla? –

+0

Dobre pytanie - nie wiem :) – Seibar

+0

@Terrapin: Proszę wypróbować metodę RefreshSection zgodnie z sugestią KieranBenton, to działa. Zobacz moją odpowiedź w tym wątku SO: http://stackoverflow.com/questions/272097/net-dynamically-refresh-app-config – dotnetguy

13

To wydaje się być wadą (może błędem), gdy korzystasz z zewnętrznego pliku konfiguracyjnego dla aplikacji ustawień. Próbowałem go za pomocą atrybutu configSource, a RefreshSection po prostu nigdy nie działa, zakładam, że to jest to samo, gdy używasz atrybutu pliku. Przeniesienie ustawień aplikacji z powrotem do twojego web.config RefreshSection będzie działało idealnie, ale poza tym obawiam się, że jesteś zgubiony.

+3

Zauważyłem to samo. Jakieś rozwiązania? – Martin

-1

pisać, dzwonić to w ten sposób:

Dim config Jak System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration ("~")

Return AddOrUpdateAppSetting (config „YourSettingKey ”,«YourValueForTheKey»)

Aby przeczytać i upewnić się uzyskać wartości w pliku, zamiast tych w pamięci podręcznej, czytać to w ten sposób:

Dim config As System.Configuration.Configuration = WebConfigurationManager.OpenWebConfiguration("~") 
    Return config.AppSettings.Settings("TheKeyYouWantTheValue").Value 

Pełny przykład:

Protected Shared Function AddOrUpdateAppSetting(_ 
     ByVal Config As System.Configuration.Configuration _ 
    , ByVal TheKey As String _ 
    , ByVal TheValue As String _ 
    ) As Boolean</p> 

    Dim retval As Boolean = True 

    Dim Itm As System.Configuration.KeyValueConfigurationElement = _ 
     Config.AppSettings.Settings.Item(TheKey) 
    If Itm Is Nothing Then 
     If Config.AppSettings.Settings.IsReadOnly Then 
     retval = False 
     Else 
     Config.AppSettings.Settings.Add(TheKey, TheValue) 
     End If 


    Else 
     ' config.AppSettings.Settings(thekey).Value = thevalue 
     If Itm.IsReadOnly Then 
      retval = False 
     Else 
      Itm.Value = TheValue 
     End If 


    End If 
    If retval Then 
    Try 
     Config.Save(ConfigurationSaveMode.Modified) 

    Catch ex As Exception 
     retval = False 
    End Try 

    End If 

    Return retval 

End Function 
+0

Tag mówi C# not vb.net –

-2

Czy próbowałeś przechowywania AppSettings we własnym pliku zewnętrznego?

Od app.config/web.config:

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

appSettings.config:

<?xml version="1.0"?> 
<appSettings> 
    <add key="SomeKey" value="SomeValue" /> 
</appSettings> 

Zmiany dokonane appSettings.config powinny zostać odzwierciedlone natychmiast. Więcej informacji: http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx

+2

Uważam, że OP używa już zewnętrznego pliku. Jego pytanie dotyczy odzwierciedlenia zmian dokonanych w pliku zewnętrznym bez ponownego uruchomienia aplikacji (domeny aplikacji). – dotnetguy

+0

Uzgodniono z dotnetguy. Robi to już - to jest jego problem - robiąc to i nie będąc w stanie odświeżyć zmian dokonanych w nim w locie. – vapcguy

0

Tak. utknąłeś z ponownym uruchomieniem systemu iis.

Istnieje funkcja z programem asp.net 4.0 i iis 7.5, w której początkowe uruchomienie zostało usunięte.

0

Nie jestem pewien, czy jest to możliwe w aplikacji internetowej, ale działa ona w aplikacji komputerowej. Spróbuj użyć ConfigurationSettings zamiast ConfigurationManager (będzie przekrzykiwał Cię za używanie przestarzałych klas ...), a następnie odczytanie wszystkich danych do klasy. Jeśli chcesz odświeżyć, po prostu utwórz nową instancję i usuń wszystkie odniesienia do starej instancji. Moja teoria wyjaśnia, dlaczego to działa (może być źle): gdy nie uzyskujesz bezpośredniego dostępu do pliku app.config przez cały czas pracy, blokada pliku jest usuwana przez aplikację. Następnie można wprowadzić zmiany, gdy nie uzyskujesz dostępu do pliku.

3

Alternatywnie można napisać własny numer ConfigSection i ustawić restartOnExternalChanges="false".

Następnie, po przeczytaniu sekcji z ConfigurationManager.GetSection("yourSection") ustawienia zostaną automatycznie zmienione bez ponownego uruchomienia aplikacji.

Można również zaimplementować ustawienia mocno wpisane lub jako NameValueCollection.

4

Z jakiegoś powodu ConfigurationManager.RefreshSection("appSettings") nie działał dla mnie. Ponowne załadowanie obiektu Web.Config do obiektu Configuration wydaje się działać poprawnie. Poniższy kod zakłada, że ​​plik Web.Config jest jednym katalogiem poniżej folderu wykonującego (bin).

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap(); 
Uri uriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)); 
string appPath = uriAssemblyFolder.LocalPath; 
configMap.ExeConfigFilename = appPath + @"\..\" + "Web.config"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 

i służy jak:

string webConfigVariable = config.AppSettings.Settings["webConfigVariable"].Value; 
+0

Czy zmiany w Web.config nie powinny automatycznie wpływać na kolejne żądanie serwera IIS? – Yogee

1

.RefreshSection() nie działa, gdy appSettings jest zewnętrzny.

Można jednak użyć następujących zmienić wartość:

ConfigurationManager.AppSettings.Set(key, value) 

To nie zmienić ustawienia w pliku, tylko wartość ładowane do pamięci.

Więc zamiast korzystania RefreshSection Zrobiłem następujące:

string configFile="path to your config file"; 
XmlDocument xml = new XmlDocument(); 
xml.Load(configFile); 

foreach (XmlNode node in xml.SelectNodes("/appSettings/add")) 
{ 
    string key = node.Attributes["key"].Value; 
    string value= node.Attributes["value"].Value; 
    ConfigurationManager.AppSettings.Set(key, value); 
} 

Wszelkie późniejsze wywołania AppSettings.Get będzie zawierała zaktualizowaną wartość.

Ustawienia aplikacji zostaną zaktualizowane bez konieczności ponownego uruchamiania aplikacji.