Автоматическое обновление службы Windows

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

Я потратил немало времени на поиски лучших практик для автообновлений Windows Service, но нашел очень мало полезной информации. Большинство методов, таких как ClickOnce, похоже, предназначены главным образом для приложений на базе Windows Forms.

Мой текущий план:

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

Некоторые важные проблемы для меня:

  • Возможность обрабатывать обновления как для основной службы, так и для службы обновлений
  • Возможность обработки прерываний, таких как сбой питания или отказ соединения в любой момент процесса обновления.

Что интересно, если это общий способ решить эту проблему и/или если я упустил что-то важное. Это слишком сложно или, возможно, слишком упрощенно? Как бы вы это сделали (или, что еще лучше, как вы это сделали успешно)?

Спасибо!

Ответы

Ответ 1

В прошлом году я столкнулся с той же проблемой, и я боролся с множеством тех же вопросов. Несколько советов:

  • Так как любая услуга может быть обновлена, обе службы будут функционировать как обновители другой. Услуга A будет обновите службу B и наоборот. Для эта причина, я предлагаю просто бежать обе службы в любое время. Если не вы беспокоитесь о загрузке вниз по вашему серверу звонки-обновления-существуют, включить/отключить управление услугами не стоит накладных расходов.

  • Подобные сервисы не могут быть установлены на одиночный машина. Другими словами, вы не могут устанавливать новые и старые версии служба бок о бок, если они одно и то же имя. Если вы не хотите усложнить процесс обновления, я предложите удалить старую версию а затем установите новую версию. Например, Service A будет загружать Установщик службы B, удаление Служба B, установите новую версию Обслуживание B, а затем запустить. Обслуживание B будет делать то же самое для службы А.

  • Поскольку каждая служба управляет другие, они должны не только проверять доступных обновлений, но они должны проверяйте друг друга здоровье. Для Например, служба A проверит, чтобы увидеть если Служба B существует, и если она Бег. Если проверка работоспособности завершилась неудачей, список шагов для решения проблемы и запустить работу будет завершена службой А. Выполнение проверка работоспособности и восстановление покроет вас теперь вопрос какой вопрос возникает с обновлением, начальным установки или общих операций.

  • Достаточно выполнить регистрацию на клиенте и сервер. Вы хотите отслеживать какие действия были предприняты и когда. Например, служба A может, когда она проверяет наличие обновлений, когда это выполнение проверки работоспособности и связанных действий. О сервисе (при условии, что вы звоните в сеть сервис ищет обновления) track звонки, совершаемые каждой службой. Если ваши услуги не обновляются по крайней мере, у вас будет след панировочные сухари (или отсутствие сухарей) указывая на проблему.

Есть буквально пучки потенциальных getchas с таким решением: службы не запускаются при запуске, UAC мешает, не имея возможности устанавливать и деинсталлировать сервисы с одним и тем же пользователем, гарантируя, что пользователь, устанавливающий службу, имеет достаточно разрешений, потери связи, получения .NET Framework на клиентском компьютере, обработки перезагрузки после установки и т.д.

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