Взаимодействие сервиса и программы

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

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

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

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

В то время как первый вариант легче написать, второй кажется лучше.

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

Спасибо.


person Giorgi    schedule 05.03.2010    source источник


Ответы (3)


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

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

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

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

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

person moribvndvs    schedule 05.03.2010
comment
Любые советы по этому поводу? Служба в моем случае довольно проста, поэтому я считаю, что для нее не должно быть слишком сложно перенастроить себя. - person Giorgi; 05.03.2010

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

Но ExecuteCommand довольно чистый и хорошо.

person Timores    schedule 05.03.2010
comment
Проблема с файлом в том, что я могу связать программу со службой. - person Giorgi; 05.03.2010
comment
Служба и графический интерфейс должны взаимодействовать, поэтому они связаны, каким бы ни было решение. Обычный напильник не такая тесная связь. Возможно, это более слабая связь, чем прямая связь между ними. - person Timores; 06.03.2010

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

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

person Eric J.    schedule 05.03.2010