2011-02-24 84 views
7

我知道這可能以前已經問過,但我似乎無法爲我找到正確的答案。windows服務 - 配置文件

我有一個Windows服務名爲foobar.exe。我有一個名爲的應用程序配置文件foobar.exe.config在同一個文件夾中。

是配置文件只在啓動時讀取?

我想更改配置文件,而無需重新啓動該服務,但是這是我能得到新的設置讀取的唯一途徑。

我在做什麼錯?

一個窗口服務可以有一個動態的配置文件?

+0

這個服務是用.NET編寫的嗎? – Oded 2011-02-24 13:03:04

+0

是的,這是一個.NET網絡服務 – 2011-02-24 13:19:02

回答

7

.NET應用程序將在啓動時讀取它們的配置文件,併爲了性能原因緩存它們。

我看到周圍這兩種基本方式:

  • 在服務

    ,跟蹤上次更新日期/時間配置文件。定期檢查此最後更新日期,如果檢測到更改,請重新加載配置文件

  • Windows NT服務可以響應特殊的OnCustomCommand事件。您可以實現這樣的事件處理程序重新加載配置,當你做更改配置,你可以有一個小工具來通知你的服務,它的配置已經改變,併發送「自定義命令」爲您服務

+0

好的,請原諒我的無知。當我的進程檢測到配置文件已更改時,如何「重新加載」配置?我在我的代碼中使用ConfigurationManager.AppSettings [「SettingName」]。 – 2011-02-24 13:20:10

+1

@hobbyman:你可以調用ConfigurationManager.RefreshSection(「appSettings」),當你下一次訪問它時,這個部分將從磁盤重新加載。請參閱[Configuration Manager MSDN文檔](http://msdn.microsoft.com/zh-cn/library/system.configuration.configurationmanager.refreshsection.aspx#Y102) – 2011-02-24 13:27:43

2

假設你的Windows服務是寫在.NET:

配置文件只在啓動時讀取。如果您更改配置中的值,則需要重新啓動服務才能獲取它們。

如果你想擁有動態配置,則需要自己實現 - 輪詢文件系統來查看是否配置文件更改和應用更改。

2

您可能需要查看使用FileSystemWatcher。參見下面的僞c#代碼示例。

private FileSystemWatcher _myWatcher; 

protected override void OnStart(string[] args) 
{ 
_myWatcher = new FileSystemWatcher(); 
_myWatcher.Path = path to config file; 
_myWatcher.Changed += new FileSystemEventHandler(myWatcherFileChanged); 
_myWatcher.NotifyFilter = NotifyFilters.LastWrite; 
_myWatcher.EnableRaisingEvents = true; 

} 

protected override void OnStop() 
{ 
    _myWatcher.EnableRaisingEvents = false; 
} 

private void myWatcherFileChanged(object sender, FileSystemEventArgs e) 
{ 
... 
}