Проверьте, была ли служба Windows принудительно завершена - PullRequest
2 голосов
/ 11 ноября 2009

У меня есть служба Windows, написанная на C # .NET Framework 3.5, и я хотел бы знать, как лучше всего проверить, было ли предыдущее завершение работы службы регулярным.

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

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

Этот способ кажется слишком ненадежным и не очень хорошей практикой. Что вы предлагаете?

Пояснение: Служба работает на сервере и прослушивает соединения с клиентских компьютеров. Как только соединение установлено, оно связывается с удаленной базой данных через веб-сервисы и определяет, имеют ли они право на соединение (и, следовательно, используют приложение, которое является вызывающей стороной). Одним из аспектов защиты является проверка параллелизма, и если у меня установлено ограничение на 5 рабочих станций, я поддерживаю соединение TcpClient от службы Windows до, скажем, 5 рабочих станций, а шестое не может подключиться.

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

Ответы [ 5 ]

2 голосов
/ 12 ноября 2009

Я пошел с этим в конце концов: Служба использовалась для проверки подключенных рабочих станций на предмет их работоспособности, но теперь я также встроил периодическую проверку со всех рабочих станций (они подключаются через общий маршрутизатор dll, где я встроил проверку). Каждые 10 секунд соединение проверяется, и если его нет, клиент будет пытаться восстановить соединение через 15 секунд, что будет успешным, если возникла только временная проблема с сетью, но не удастся, если служба была принудительно закрыта (поскольку это объекты Tcp будут потеряны).

2 голосов
/ 11 ноября 2009

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

Например. Вы можете прикрепить к событию Unhanded Exception AppDomains и попытаться зарегистрировать это исключение. Или вы могли бы оценить, как журнал работает / не работает (немного сложнее разобрать файл журнала для этой задачи).

Конечно, это не повод для отказа от использования лог-файлов.

1 голос
/ 11 ноября 2009

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

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

0 голосов
/ 11 ноября 2009

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

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

--- РЕДАКТИРОВАТЬ после уточнения ---

Таким образом, требование заключается в системе лицензирования, а не просто в том, чтобы определить, была ли служба корректно завершена. Я предполагаю, что желание состоит в том, чтобы «лицензии» были очищены при постепенном завершении работы и восстановлены после сбоя, сценарии являются взаимозаменяемыми.

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

Если в истории есть еще что-то, дайте нам знать.

0 голосов
/ 11 ноября 2009

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

Лично я думаю, что зашифрованный XML-файл излишний, достаточно простого текстового файла.

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