Проблема с тестированием службы Windows - PullRequest
18 голосов
/ 05 апреля 2010

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

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

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

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

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

Ответы [ 6 ]

20 голосов
/ 05 апреля 2010

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

Что вам нужно сделать, это примерно так - в вашем 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.

12 голосов
/ 05 апреля 2010

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

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

3 голосов
/ 04 мая 2012

Ответ от 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();
    }
3 голосов
/ 05 апреля 2010

Используйте регистратор, чтобы сообщить об ошибках!

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

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

Ура, B.

2 голосов
/ 05 апреля 2010

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

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

Есть несколько способов:

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

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

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