Ответ 1
Вы можете приложить решение визуальной студии к приложению Windows. Затем вы можете отлаживать службу Windows, как и обычный проект.
Отладка → Присоединить к процессу.
Я хочу сделать службу Windows, которая будет обращаться к моей базе данных. Моя база данных - SQL Server 2005.
На самом деле я работаю над сайтом, и моя база данных находится внутри нашего сервера. Мне нужно каждую секунду обращаться к моей базе данных и обновлять записи. Для этого мне нужно сделать службу Windows, которая будет установлена на наш сервер и выполнить задачу.
Я получаю доступ к базе данных с моего локального компьютера, а затем запускаю службу, но проблема в том, что я не уверен, как я могу проверить эту службу.
Я попытался установить на свою локальную машину. Он был установлен, а затем я запустил службу, но она не выполнила задачу, и я думаю, что служба не может подключиться к базе данных.
В службе и ее установщике нет проблем. Единственная проблема заключается в том, как протестировать мою службу Windows.
Вы можете приложить решение визуальной студии к приложению Windows. Затем вы можете отлаживать службу Windows, как и обычный проект.
Отладка → Присоединить к процессу.
Вы всегда можете создать гибрид приложения/консоли и использовать консольное приложение для тестирования.
Что вам нужно сделать, это что-то вроде этого - в 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
.
Использовать регистратор для сообщения об ошибках!
Попробуйте поймать все возможные ошибки и зарегистрировать их в файле и/или лучше отправить электронное письмо: помните "никто не слышит, как умирает служба"!
Log4Net имеет регистратор для обработки скользящих файлов, постоянства dabatase и даже SMTP-сообщений. Например, см. http://logging.apache.org/log4net/release/config-examples.html Вероятно, вы достаточно часто проверяете файл журнала на наличие ошибок. Чтобы избежать такой работы, я часто использую приложение SMTP.
Cheers, Б.
Ответ 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();
}
Существует несколько способов:
1) Создайте стандартное приложение Windows, которое вызывает тот же код, это легче запускать и отлаживать. Это также гарантирует, что ваш код обслуживания не входит в сервис, но реорганизован на собственную сборку.
2) В файле вашей серверной программы проверьте, запущена ли служба, и вызовите методы службы в службе для запуска один раз. Таким образом, вы также можете просто запустить из Visual Studio. (вам нужно будет сделать ваши методы обслуживания и т.д. общедоступными и создать позицию вашей службы).
Я думаю, что у всех есть много отличных ответов. Это был мой упорядоченный подход к отладке этой проблемы: