2010-10-18 3 views
7

Каковы некоторые рекомендации по развертыванию службы Windows, которую необходимо будет обновить?C# ClickOnce для служб Windows?

У меня есть служба Windows, которую я буду развертывать, но может потребоваться отладка и новые версии во время бета-процесса. Каков наилучший способ справиться с этим? В идеале я бы хотел найти решение для развертывания в стиле ClickOnce для служб Windows, но я понимаю, что этого не существует. Что ближайшего я могу сделать для ClickOnce для службы Windows?

+0

Также см http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-can-update-itself-at-runtime/4002465#4002465 –

ответ

7

Простым решением, которое я использую, является просто прекращение службы и x-копирование файлов из папки bin в служебную папку.

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

Net stop myService 
xcopy \\myServerWithFiles\*.* c:\WhereverTheServiceFilesAre 
net start myService 
+1

Мне нравится этот, быстрый и легкий! – Lukasz

+0

Эй, мне это нравится. Я по сути дела делаю то же самое вручную при отладке. – nportelli

2

Поскольку служба долго работает, использование развертывания стиля ClickOnce может оказаться нецелесообразным - поскольку ClickOnce обновляется только при запуске приложения. Обычно сервис запускается только при перезагрузке машины.

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

Одна идея, которая может просто работать, - это развертывание активного каталога (или аналогичный эквивалент). Если ваша служба развернута с помощью стандартного установщика MSI-типа, AD позволяет вам без проблем обновлять приложение в рамках компьютерной политики. Я подозреваю, что вам нужно заставить сервер обновить политику AD (перезагрузив или используя gpupdate с консоли), но кроме этого это должно быть развертывание с отключением.

3

Я бы предложил использовать подход «плагин» на этом, то есть с помощью Proxy Design Pattern.

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

+0

+1. Как и ответ на этот вопрос: http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-can-update-itself-at-runtime/4002465#4002465 –

1

Я бы предложил создать обычный проект установки и добавить проект проекта службы Windows в этот проект установки.

Для получения дополнительной информации см. http://support.microsoft.com/kb/816169.

3

У меня есть система, которую мы используем на работе здесь, которая, похоже, работает очень хорошо с сервисами. Наша развернутая система насчитывает около 20-30 сервисов в любой момент времени. На работе мы используем продукт под названием TopShelf, вы можете найти его здесь http://topshelf-project.com/

В основном TopShelf обрабатывает много всего связанного с обслуживанием материала. Установка, удаление и т. Д. Все из строки cmd службы. Одной из очень полезных функций является возможность запуска в качестве консоли для отладки. Вы создаете одну услугу, и с другим запуском линии cmd вы можете запускать ее как консоль, чтобы увидеть результат работы службы. Мы добавили одну специальную функцию к этому программному обеспечению, которая позволяет нам заранее настраивать профили. В основном наши профили настраивают несколько вещей, таких как ведение журнала, расположение ресурсов и т. Д., Чтобы мы могли контролировать все это, не переиздавая какой-либо код. Все, что мы делаем, это запустить команду, как

D: \ Services \ ServiceName.exe Core.Profiles.Debug или
D: \ Services \ ServiceName.exe Core.Profiles.Производство

для получения различных конфигураций каротажа.

Наш скрипт сборки создает сценарии install.cmd и uninstall.cmd для каждого из наших сервисов, все, что мы делаем, это копирование файлов на сервер и запуск сценария. Если мы хотим увидеть вывод отладки, мы остановим службу и дважды щелкните по exe, и мы получим консоль, чтобы прочитать весь вывод.

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

Однако мое предложение, если вам нужна 100% -ная доступность услуг, заключается в наличии избыточной системы. Независимо от того, как вы настраиваете свою услугу для обновлений, вы не можете избежать сбоя оборудования, что приведет к простою без автоматической системы аварийного переключения. Если бы эта система была на месте, моя рекомендуемая стратегия обновления заключалась бы в том, чтобы отключить 1 узел, обновить, протестировать, включить выключить другой узел, обновить, протестировать и снова включить второй узел. Вы можете сделать это, конечно, с помощью простого сценария. Это может быть более сложная система, чем вам нужно, но если вы не можете воспользоваться сервисом в автономном режиме для простого перезапуска, который занимает 5 секунд, вам действительно нужна какая-то система для решения аппаратных проблем, потому что я могу гарантировать, что это произойдет в конечном итоге.

Смежные вопросы