Создание и отладка windows служб

Programming
Предыдущий Следующий

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

  1. Создайте проект WindowsService.
     
  2. В конструкторе выберите Service1. Затем в окне Свойства присвойте свойству ServiceName и свойству (Name) компонента Service1 значение MyNewService
     
  3. Для работы из службой используються два метода: OnStart  и OnStop
     
  4. Приложение службы предназначено для долговременного выполнения. Соответственно, оно обычно опрашивает или отслеживает что-либо в системе. Отслеживание настраивается в методе OnStart. Тем не менее, метод OnStart не отвечает за фактическое отслеживание. После начала работы службы метод OnStart должен возвращать управление операционной системе. Он не должен уходить в бесконечный цикл или блокироваться. Для создания простого механизма опроса можно воспользоваться компонентом System.Timers.Timer. В методе OnStart можно задать параметры компонента и установить значение true для свойства Enabled. Таймер будет выполнять периодическую генерацию событий, при возникновении которых служба сможет вести отслеживание.
     
  5. Тобто создаем два (общето можно и одни если не нужно зацыкливать процесс) обекта " private System.Timers.Timer OurTimer; " и " private bool IsWorkThread = false; " . Первый это таймер, второй будет делать вечный цыкл. (Эти переменые создаються как поля класса, т.е. НЕ в методе)
     
  6.  После этого метод старт будет иметь код

    protected override void OnStart(string[] args){

              IsWorkThread = true; //Переменная для вечного цикла (может не понадобиться)

              int period = 1000;//Через какое время будет срабатывать таймер (1000 - это 1 секунда)

             this.OurTimer = new System.Timers.Timer();

             this.OurTimer.Interval = period;

             this.OurTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.OurTimer_Tick);

             this.OurTimer.AutoReset = false;//Если нужен вечный цикл, то устанавливаем это свойство как false, что будет означать что таймер сработает только один раз. Если вечный цикл не нужен то установить в true

             this.OurTimer.Start();
    }

    OurTimer_Tick - это функция где будет основной код.

  7. В методе стоп, будем останавливать наш процесс :

     

    protected override void OnStop() {
             IsWorkThread = false;
             if (OurTimer != null) {
                      OurTimer.Enabled = false;
    }}
  8. Осталося еще пример функции для таймера OurTimer_Tick :

    private void OurTimer_Tick(object sender, System.Timers.ElapsedEventArgs e)
            {
                while (IsWorkThread) //Вечный цикл ( это очень плохой пример цикла)
                {
                    try
                    {
                        //Что-то делаем
                    }
                    catch (Exception ex)
                    {
                        IsWorkThread = false;
                    }
                }
            }
  9. На этом все программирование заканчиваться, остаеться настроить службу для установки. Для этого в обозревателе решений(Solution Explorer) щелкните правой кнопкой Service1.vb, Service1.cs или Service1.jsl и выберите команду Просмотреть конструктор(View Designer).
  10. Щелкните фон конструктора, чтобы выбрать саму службу, а не какой-либо из ее элементов.
  11. Щелкните правой кнопкой мыши в активном окне конструктора и выберите команду Добавить установщик (Add Installer). По умолчанию в проект добавляется класс компонента, содержащий два установщика. Компоненту присваивается имя ProjectInstaller, а содержащиеся в нем установщики предназначаются для установки службы и связанного со службой процесса.
  12. В режиме Конструктор для ProjectInstaller выберите ServiceInstaller1 или serviceInstaller1
  13. В окне Cвойства(Properties) задайте значение MyNewService для свойства ServiceName.
  14. Задайте свойству StartType значение Automatic.
  15. В конструкторе выберите ServiceProcessInstaller1 (для проекта на Visual Basic) или serviceProcessInstaller1 (для проекта на Visual C# или Visual J#). Задайте свойству Account значение LocalService. Это приведет к установке и выполнению службы с использованием локальной учетной записи служб.  Учетная запись LocalService действует как пользователь, не имеющий прав на локальном компьютере, и предоставляет учетные данные для анонимного доступа к любому удаленному серверу. Другие учетные записи следует использовать с осторожностью, поскольку они имеют более полные права доступа и увеличивают риск атак, исходящих от злонамеренного кода.
  16. Дальше нужно создать красивый Install программу. В обозревателе решений(Solution Explorer) правой кнопкой щелкните решение, выберите пункт Добавить(Add) и команду Создать проект(New Project).
  17. Дальше выбираем "Other Project Types" -> "Setup and Deployment" ->"Setup Project". Пусть название будет MyServiceSetup
  18. В обозревателе решений щелкните правой кнопкой мыши элемент MyServiceSetup, наведите указатель на пункт Добавить и выберите Выходной элемент проекта (Project Output).
  19. В окне Проект будет выбран элемент MyNewService
  20. Выберите из списка элемент Основные выходные файлы (Primary Output) и нажмите кнопку ОК. В установочный проект будет добавлен элемент проекта, соответствующий основным выходным файлам MyNewService.
  21. В обозревателе решений(Solution Explorer) щелкните правой кнопкой мыши проект установки, наведите указатель на пункт Вид(View) и выберите Настраиваемые действия(Custom Actions).
  22. В редакторе настраиваемых действий(Custom Actions ) щелкните правой кнопкой узел Настраиваемые действия(Custom Actions) и выберите команду Добавить настраиваемое действие(Add Custom Action).
  23. Дважды щелкните пункт Папка приложения(Application Folder) в списке, чтобы открыть его, выберите Основные выходные файлы для MyNewService (Primary Output from MyNewService (Active))и нажмите кнопку ОК.  Во все четыре узла настраиваемых действий (Установить, Зафиксировать, Отменить и Удалить) будут добавлены основные выходные файлы проекта.
  24. Делаем Reblid проекту-инстала, и setup.exe ждет вас в папке Debug. (Этот файл производит установку и удаление сервиса. Но он работает только со своей версией билда, если Вы поменяли код, но забыли с компа удалить старый сервис, то могут возникнут проблемы при его удалении. Для такого есть папка Release, куда я копирую последний использованный setup.exe).
  25. Для запуска сервиса, нужно нажать правой клавишей мышки на иконки "Мой копмьютер", выбрать меню "Управление". В появившемся окне ищем "Службы" и в этом списке свою службу, запускаем.

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

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

Короче, для дебага нужно сделать:

  1. Установите и запустите службу (многие забывают :-))
  2. В меню Отладка(Debug) Visual Studio выберите пункт Процессы (Attach to Process...).
  3. Поставьте галочки, что бы показывало все процессы
  4. В списке найдите свою службу и присоединитесь к ней (Attach)
  5. Поставьте BreakPoint в нужном методе и будет вам радость.

Одно из альтернатив служ есть scheduler, но как-то службы мне больше по душе.

Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве Магія зміни: Від ночі до дня
Магія Вечірнього Неба: Відлякуйте втомленість дня і зануртеся у світ загадок і краси