2008-10-07 85 views
36

有沒有人得到這個在Web應用程序中的工作?重新加載配置,而無需使用ConfigurationManager重新啓動應用程序。刷新段

無論我做什麼,似乎我的appSettings部分(從web.config重定向使用appSettings文件=「。\ Site \ site.config」)不會重新加載。

我註定不得不重新啓動應用程序的情況嗎?我希望這種方法能夠讓我獲得更高性能的解決方案。

更新:

通過「重裝」我的意思是清爽ConfigurationManager.AppSettings而無需完全重新啓動我的ASP.NET應用程序,並且承擔平時的啓動延遲。

回答

45

確保您傳遞正確的case sensitive值RefreshSection,即

ConfigurationManager.RefreshSection("appSettings"); 
-1

當應用程序啓動時,App.Config設置被緩存在內存中。出於這個原因,我認爲你不用重新啓動你的應用程序就可以改變這些設置。另一個應該非常簡單的方法是創建一個單獨的簡單XML配置文件,並自行處理加載/緩存/重新加載。

+0

那麼什麼是http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.refreshsection.aspx? – 2008-10-07 16:43:57

+0

好問題 - 我不知道:) – Seibar 2008-10-07 17:00:05

+0

@Terrapin:請嘗試按照KieranBenton建議的RefreshSection方法,它的工作原理。在這個線程中看到我的答案:http://stackoverflow.com/questions/272097/net-dynamically-refresh-app-config – dotnetguy 2012-07-11 06:08:01

13

當你的appSettings使用外部配置文件時,這似乎是一個缺陷(也許是一個bug)。我已經嘗試過使用configSource屬性和RefreshSection根本無法工作,我假設這是使用文件屬性時相同。 如果您將appSettings移回到您的web.config中,RefreshSection將完美運行,否則恐怕您註定要失敗。

+3

我也注意到了。任何解決方案 – Martin 2016-01-08 11:29:56

-1

要編寫,按此方法調用:

昏暗配置作爲System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration( 「〜」)

返回AddOrUpdateAppSetting(配置,「YourSettingKey 」,‘YourValueForTheKey’)

要閱讀,並確保你得到的值文件,而不是那些在高速緩存中,讀這樣說:

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

完整的示例:

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

標籤說C#不是vb.net – 2015-07-06 14:57:35

0

是的。你堅持iis重啓。

有一個與asp.net 4.0和iis 7.5中的初始啓動被刪除的功能。

0

我不確定這是否可以在網絡應用程序中使用,但它適用於桌面應用程序。嘗試使用ConfigurationSettings而不是ConfigurationManager(它會對您使用過時的類進行大肆宣傳......),然後將所有數據讀入一個類。當你想刷新時,只需創建一個新實例並刪除對舊實例的所有引用。我的理論是爲什麼這個工作原理(可能是錯誤的):當你在運行的整個過程中沒有直接訪問app.config文件時,文件鎖被應用程序刪除。然後,可以在您未訪問文件時進行編輯。

3

作爲替代方案,您可以編寫自己的ConfigSection並設置restartOnExternalChanges="false"

然後,當閱讀ConfigurationManager.GetSection("yourSection")部分時,設置將爲自動刷新,無需重新啓動應用程序

你可以實現你的設置強類型或NameValueCollection。

4

由於某種原因ConfigurationManager.RefreshSection("appSettings")不適合我。將Web.Config重新加載到配置對象似乎正常工作。以下代碼假定Web.Config文件是執行(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); 

,並使用類似:

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

.RefreshSection()時的appSettings是外部不工作。

但是,您可以使用以下方法來改變值:

ConfigurationManager.AppSettings.Set(key, value) 

這不會在內存中改變文件中的設置,只加載的值。

因此,而不是使用RefreshSection我做了以下內容:

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

到AppSettings.Get任何後續調用將包含更新後的值。

appSettings將被更新,無需重新啓動應用程序。

相關問題