Подтвердить что ты не робот

Проблема с тестированием службы Windows

Я хочу сделать службу Windows, которая будет обращаться к моей базе данных. Моя база данных - SQL Server 2005.

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

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

Я попытался установить на свою локальную машину. Он был установлен, а затем я запустил службу, но она не выполнила задачу, и я думаю, что служба не может подключиться к базе данных.

В службе и ее установщике нет проблем. Единственная проблема заключается в том, как протестировать мою службу Windows.

4b9b3361

Ответ 1

Вы можете приложить решение визуальной студии к приложению Windows. Затем вы можете отлаживать службу Windows, как и обычный проект.

Отладка → Присоединить к процессу.

Ответ 2

Вы всегда можете создать гибрид приложения/консоли и использовать консольное приложение для тестирования.

Что вам нужно сделать, это что-то вроде этого - в program.cs изменить метод Main для запуска службы или, возможно, для запуска в качестве консольного приложения:

static class Program
{
    static void Main(params string[] args)
    {
        string firstArgument = string.Empty;

        if (args.Length > 0)
        {
            firstArgument = args[0].ToLowerInvariant();
        }

        if (string.Compare(firstArgument, "-console", true) == 0)
        {
            new YourServiceClass().RunConsole(args);
        }
        else
        {
            ServiceBase[] ServicesToRun = new ServiceBase[] { new YourServiceClass() };
            ServiceBase.Run(ServicesToRun);
        }
    }

а затем в вашем классе обслуживания, который наследуется от ServiceBase и имеет OnStart и OnStop, добавьте метод RunConsole следующим образом:

    public void RunConsole(string[] args)
    {
        OnStart(args);

        Console.WriteLine("Service running ... press <ENTER> to stop");

        //Console.ReadLine();
        while (true)
        { }

        OnStop();
    }

Теперь, если вы хотите запустить приложение для проверки его функциональности, просто запустите EXE с параметром командной строки -console и поместите контрольную точку в метод RunConsole.

Ответ 3

Использовать регистратор для сообщения об ошибках!

Попробуйте поймать все возможные ошибки и зарегистрировать их в файле и/или лучше отправить электронное письмо: помните "никто не слышит, как умирает служба"!

Log4Net имеет регистратор для обработки скользящих файлов, постоянства dabatase и даже SMTP-сообщений. Например, см. http://logging.apache.org/log4net/release/config-examples.html Вероятно, вы достаточно часто проверяете файл журнала на наличие ошибок. Чтобы избежать такой работы, я часто использую приложение SMTP.

Cheers, Б.

Ответ 4

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

Заимствование из кода Игаля Сербана для создания консоли, здесь улучшается метод RunConsole(), который делает паузу:

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool AllocConsole();

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool FreeConsole();

    public void RunConsole(string[] args)
    {
        OnStart(args);

        AllocConsole();

        Console.WriteLine("Service running ... press <ENTER> to stop");

        Console.ReadLine();

        FreeConsole();

        OnStop();
    }

Ответ 5

Существует несколько способов:

1) Создайте стандартное приложение Windows, которое вызывает тот же код, это легче запускать и отлаживать. Это также гарантирует, что ваш код обслуживания не входит в сервис, но реорганизован на собственную сборку.

2) В файле вашей серверной программы проверьте, запущена ли служба, и вызовите методы службы в службе для запуска один раз. Таким образом, вы также можете просто запустить из Visual Studio. (вам нужно будет сделать ваши методы обслуживания и т.д. общедоступными и создать позицию вашей службы).

Ответ 6

Я думаю, что у всех есть много отличных ответов. Это был мой упорядоченный подход к отладке этой проблемы:

  • Проверьте журнал событий.
  • Запишите все ошибки (Log4Net, корпоративная библиотека или просто напишите в журнал событий), особенно попробуйте .catch в вашем основном методе.
  • Напишите единичные тесты, которые вы можете запустить в среде.
  • Убедитесь, что ваш файл app.config верен. Возможно, вам придется объединить значения из разных проектов в один.
  • Проверить подключение к базе данных. Пинг сервера. Telnet к порту 1433 (если SQL Server по умолчанию). Напишите простую консольную программу для тестирования.
  • Отладка путем присоединения к процессу.
  • Используйте гибридный подход консоли/службы (отличная техника, и я использую для потоковой передачи сообщений отладки в режиме реального времени).