2010-03-05 132 views
2

我正在用C#開發一個非常基本的Windows服務。除了服務之外,我還需要開發一個程序,用於設置服務的各種參數。服務和程序交互

由於服務和程序將在由不同用戶處理的不同運行中運行,我如何告訴服務參數已更改?

我正在考慮的一種方法是將參數保存到配置文件,然後使用ExecuteCommand方法指示設置已更改。該服務將從文件中讀取它們。

另一種選擇是使用管道將實際數據發送到服務,服務負責保存到服務。

儘管第一個選項更容易編寫,但第二個選項似乎更好。

任何建議或任何其他的選擇?

謝謝。

回答

1

我有一個小項目,有點這兩個。使用IPC將設置傳遞給客戶端,客戶端在客戶端修改設置並將其發送回去。當服務收到新設置時,它使用ConfigurationManager保存設置並相應地進行更新。我們經歷了巨大的痛苦,無需重啓就可以重新配置服務。

更新爲了滿足Giorgi的要求更多的信息:

我們使用Remoting的,但你可以,而且也應該使用WCF。積極的副作用是您可以將綁定更改爲可路由的IP,並讓遠程用戶配置服務(如果需要)。這增加了安全考慮,但您可以在WCF中進行處理,並按照您認爲合適的方式進行遠程處理。

我相信我們不能只發送ConfigurationElements或部分通過服務,所以我們只是創建了一個簡單的設置類,並且來回傳遞。在服務方面,我們有服務將Settings類轉換爲更新的ConfigurationElement,並使用ConfigurationManager保存配置。對我們來說工作得很好,但是如果你有很多可配置元素或複雜的配置模式,我可以看到這是一個巨大的痛苦。如果開始變得複雜,您可能只想使用自己的配置API,以便完全控制類型和生命週期。

最後,您需要確保執行實際工作的服務部分在可以安全地重新配置時定期檢查配置更改,並且配置啓動時已進行的處理不會受到更改的影響。一個簡單的方法是當服務從客戶端收到信號時停止服務處理,並在客戶端完成時恢復服務。

+0

關於它的任何提示?在我的情況下,這項服務非常簡單,所以我認爲它不應該很難重新配置。 – Giorgi 2010-03-05 20:58:36

2

由於您必須將這些設置保存在某個地方,因此您可以讓該服務監視這些更改。如果將設置寫入配置文件,則該服務可以使用FileSystemWatcher。如果您將它們寫入註冊表,則可以使用註冊表查看器(請參閱 SO)。

但ExecuteCommand很乾淨,很好。

+0

文件的問題是我可能將程序與服務耦合。 – Giorgi 2010-03-05 20:56:11

+1

服務和GUI需要進行通信,因此無論解決方案如何,它們都是耦合的。一個普通的文件並不是那麼緊密的耦合。它可以說是比兩者之間的直接溝通更鬆散的耦合。 – Timores 2010-03-05 22:18:02

2

您可以將配置參數存儲在文件中,並使用服務中的FileSystemWatcher來監視更改。

Interprocess Communication也有各種選擇,但對於一個簡單問題來說,這是一個更復雜的解決方案。