Сервисное и программное взаимодействие - PullRequest
2 голосов
/ 05 марта 2010

Я занимаюсь разработкой очень простой службы Windows на C #.Помимо службы мне также необходимо разработать программу, которая будет использоваться для установки различных параметров службы.

Поскольку служба и программа будут работать по-разному, обрабатываться разными пользователями, как мне сообщить службе, чтопараметры изменились?

Один из способов, который я рассматриваю, - сохранить параметры в файле конфигурации, а затем использовать метод ExecuteCommand, чтобы указать, что параметры изменились.Затем служба будет считывать их из файла.

Другой вариант - использовать каналы для отправки фактических данных в службу, а служба заботится о сохранении в них.

Хотя первый вариант прощенапишите второй, кажется, лучше.

Любые предложения или любые другие альтернативы?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 05 марта 2010

Вы можете сохранить параметры конфигурации в файле и использовать FileSystemWatcher из вашего сервиса для отслеживания изменений.

Существуют также различные варианты Межпроцессное взаимодействие , но это более сложное решение для простой проблемы.

2 голосов
/ 05 марта 2010

Поскольку вам нужно будет где-то сохранить эти настройки, вы можете попросить службу поддержки следить за изменениями. Если вы запишите настройки в файл конфигурации, служба может использовать FileSystemWatcher. Если вы записываете их в реестр, может использоваться наблюдатель реестра (см. SO ).

Но команда ExecuteCommand довольно чиста и хороша.

1 голос
/ 05 марта 2010

У меня был небольшой проект, который вроде как сделал и то, и другое. Используя IPC, он передал настройки клиенту, где клиент изменил настройки и отправил их обратно. Когда служба получила новые настройки, она сохранила настройки с помощью ConfigurationManager и обновила себя соответствующим образом. Мы приложили огромные усилия, чтобы переконфигурировать сервис без перезапуска.

Обновление Чтобы выполнить запрос Giorgi для получения дополнительной информации:

Мы использовали Remoting, но вы могли и, вероятно, должны использовать WCF. Положительным побочным эффектом является то, что вы можете изменить привязку к маршрутизируемому IP-адресу и позволить удаленным пользователям настраивать службу, если хотите. Это добавляет соображения безопасности, но вы можете справиться с этим в WCF и удаленном взаимодействии по своему усмотрению.

Я считаю, что мы не могли просто отправить ConfigurationElements или разделы через службу, поэтому вместо этого мы просто создали простой класс настроек и передавали его туда и обратно. Что касается службы, то нам пришлось перевести класс Settings в обновленный элемент ConfigurationElement и сохранить конфигурацию, используя ConfigurationManager. У нас это хорошо работало, но я мог видеть, что это очень тяжело, если у вас много настраиваемых элементов или сложной схемы конфигурации. Если это становится все сложнее, вы можете просто использовать свой собственный API конфигурации, чтобы иметь полный контроль над типами и жизненным циклом.

Наконец, вам нужно убедиться, что часть службы, которая выполняет реальную работу, проверяет изменения конфигурации через регулярные промежутки времени, когда ее можно безопасно перенастроить, и что на обработку, которая уже выполнялась при запуске конфигурации, изменения не повлияют. Простой способ сделать это - остановить обработку службы, когда он получает сигнал от клиента, и возобновить работу, когда клиент говорит, что это сделано.

...