Передача параметров службы Windows для его действия - PullRequest
2 голосов
/ 19 января 2009

Я хочу превратить имеющуюся у меня программу в службу, чтобы использовать ее, не регистрируя ее. По сути, он выполняет резервное копирование указанных папок в указанное место с использованием SSH. Однако проблема, с которой я сталкиваюсь, состоит в том, что я не знаю, как сказать это этим пунктам. Я знаю только, как запускать, останавливать и запускать пользовательские команды только с целым числом с параметром.

Как я могу это сделать?

Служба Windows, а не веб-служба

edit : резервные копии папок не будут согласованными и будут обновляться при каждом запуске

Ответы [ 11 ]

6 голосов
/ 19 января 2009

Вы можете создать экземпляр службы и передать аргументы командной строки, используя класс ServiceController.

using (ServiceController serviceController = new ServiceController(serviceName))
{
   string[] args = new string[1];
   args[0] = "arg1";
   serviceController.Start(args);
}

"arg1" будет доступен как обычные аргументы командной строки в main (), когда Windows запустит службу.

2 голосов
/ 30 августа 2011

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

например. У меня есть служба Windows, в которой размещается служба WCF. Я хочу, чтобы пользователи могли указывать номер порта не по умолчанию для службы WCF для прослушивания. Они делают это, запуская службу Windows следующим образом ... MyService -port: xxxxx

Что отлично работает, пока сервер не будет перезагружен, затем Windows перезапускает MyService (но без параметров), а служба wcf по умолчанию использует исходный порт #

2 голосов
/ 31 октября 2010

Я вижу, что вы (или кто-то другой) проголосовали за ответ Себастьяна Седлака, потому что он упомянул о размещении службы WCF в службе Windows. Ваш ответ был

It's in nice bold lettering in the question. Not a Web Service, therefor WCF is out of the question

Я думаю, вы не поняли, что он имел в виду. Он не говорил о веб-сервисе . Он говорил о размещении службы WCF в вашей службе Windows .

Это далеко не одно и то же. Вы можете разместить службу WCF в любого приложения Windows (Forms / Console / Service). Смысл этого в том, что приложение затем становится доступным для связи через его внутреннюю службу WCF, таким же образом fashion , как вы можете общаться с веб-службой (вы можете * 1022). * также размещает службы WCF в IIS, кстати, что , а затем делает их "веб-службами" (в том смысле, в каком вы, похоже, имеете в виду).

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

Фактически, я сейчас работаю над проектом, который является службой Windows, с которой мне нужно иметь возможность связываться и передавать команды - и получать информацию - во время выполнения. Например, я хочу быть в состоянии сказать ему, где хранить определенные вещи, что регистрировать, сбросить / перезапустить - и опросить его на наличие сообщений о состоянии. Я делаю это, размещая Службу WCF внутри Службы Windows. Эта служба WCF предоставляет набор методов, которые в моем случае включают получение команд и возврат информации о состоянии. Поэтому, когда Служба Windows работает, я могу связаться с ней (даже удаленно) через встроенную Службу WCF и сообщить ей, что делать.

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


Однако , вы указали, что хотите, чтобы служба Windows получала настройки своей папки каждый раз, когда она запускает , что делает такую ​​пассивную настройку менее чем идеальной (поскольку она не сможет это сделать ничего, пока вы не передадите ему нужные папки).

Один из способов справиться с этим (с использованием размещенной службы WCF) - это постоянно запускать службу Windows (то есть автоматический запуск). Его состояние по умолчанию будет бездействующим. Затем вы можете выполнить команду «начать обработку», передавая нужные папки для работы (посредством вызова соответствующего метода службы WCF). Аналогично, служба WCF будет предоставлять методы, предоставляющие вам статус приложения (текущая папка, ход выполнения, занято / неактивно и т. Д.). Как только обработка будет завершена, она вернется в состояние ожидания, ожидая получения следующего набора папок.

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

1 голос
/ 01 октября 2011

RE: файл конфигурации.

Конечно, можно использовать файл конфигурации. И файл может быть изменен во время работы службы.

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

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

Размещение конфигурации в реестре имеет несколько проблем:

  • Безопасность (то есть: установщику предоставлен доступ), в зависимости от того, какое дерево используется
  • Служба не будет знать об изменениях
  • Переносимость - хотя и незначительная, так как при установке следует настроить параметры реестра

Где XML-файл легко копировать, редактировать, делиться, просматривать и понимать. Добавьте несколько хороших блоков COMMENT и подробный XSD-файл, и он тоже станет источником хорошей документации.

Просмотрите XPath для упрощения навигации и извлечения значений из файла XML.

$ 0,02 ... Дэвид ...

1 голос
/ 19 января 2009

Почему бы просто не разместить службу WCF в службе Windows, чтобы получить такие функции «администратора»? (Удаленное взаимодействие также возможно)

1 голос
/ 19 января 2009

Службы Windows имеют исполняемые файлы, как и любые другие. Я полагаю, что вы можете написать его, чтобы принять параметры командной строки и указать эти параметры в конфигурации службы Windows. Вы также можете прочитать файл конфигурации. Если вы используете .NET, в платформе есть классы конфигурационных файлов.

1 голос
/ 19 января 2009

Любая служба способна получать аргументы командной строки при запуске.

1 голос
/ 19 января 2009

Сохраните параметры запуска службы в реестре, а затем, при запуске реестра, она должна прочитать параметры запуска из реестра.

1 голос
/ 19 января 2009

Можно ли использовать файл конфигурации для указания этих элементов?

0 голосов
/ 30 августа 2011

Что касается файла app.config - я довольно уверен, что ваш сервис будет читать и использовать эти файлы, когда я пишу все мои windows-сервисы таким образом;) Так что просто поместите все, что вам нужно, в app.config в «application» (не user) и все равно отредактируйте «yourname.exe.config» в папке, откуда вы «InstallUtil» из службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...