测试Windows服务时出现问题

时间:2010-04-05 12:05:13

标签: c# windows sql-server-2005 windows-services

我想创建一个可以访问我的数据库的Windows服务。我的数据库是SQL Server 2005。

实际上我正在网站上工作,我的数据库在我们的服务器内。我需要每秒访问我的数据库并更新记录。为此,我需要制作一个将安装到我们的服务器并执行任务的Windows服务。

我一直在从本地计算机访问数据库然后运行该服务,但问题是我不确定如何测试此服务。

我尝试安装到我的本地计算机上。它安装然后我运行了服务,但它没有执行任务,我认为服务无法连接数据库。

服务及其安装程序没有问题。唯一的问题是如何测试我的Windows服务。

6 个答案:

答案 0 :(得分:20)

您始终可以创建服务/控制台应用程序混合,并使用控制台应用程序进行测试。

您需要做的是这样的事情 - 在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并且具有OnStartOnStop,请添加RunConsole方法,如下所示:

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

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

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

        OnStop();
    }

现在,如果您想运行应用程序来测试其功能,只需使用-console命令行参数启动EXE,并在RunConsole方法中添加断点。

答案 1 :(得分:12)

您可以将visual studio解决方案附加到Windows服务应用程序。然后,您可以像正常项目一样调试Windows服务。

调试 - &gt;附加到流程。

答案 2 :(得分:3)

使用记录器报告错误!

尝试捕获每个可能的错误并将其记录在文件中和/或更好地发送电子邮件:记住“没有人听到服务死亡”!

Log4Net具有记录器来处理滚动文件,dabatase持久性甚至SMTP消息。例如,请参阅:http://logging.apache.org/log4net/release/config-examples.html 您可能会定期检查日志文件中的错误。为了避免这种苦差事,我经常使用SMTP appender。

干杯, 乙

答案 3 :(得分:3)

marc_s的答案是完美的,但是因为服务的主线程没有按预期等待用户输入暂停。我认为这就是他进入无限循环的原因。

借用Igal Serban'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();
    }

答案 4 :(得分:2)

有几种方法:

1)创建一个调用相同代码的标准Windows应用程序,这样更容易运行和调试。这也可以确保您的服务代码不在服务范围内,而是重构为自己的程序集。

2)在您的服务器程序文件中,检测服务是否以交互方式运行,并调用服务中的服务方法以运行一次。这样您也可以从Visual Studio运行。 (您需要公开您的服务方法等,并建立您的服务的立场)

答案 5 :(得分:2)

我认为每个人都提供了很多很棒的答案。这将是我调试此问题的有序方法:

  • 检查您的活动日志。
  • 记录所有错误(Log4Net,Enterprise Library,或只写入事件日志),特别是在Main方法中有一个try..catch。
  • 编写可以在环境中运行的单元测试。
  • 确保您的app.config文件正确无误。您可能需要将来自不同项目的值合并为一个。
  • 测试数据库连接。 Ping服务器。 Telnet到端口1433(如果是默认的SQL Server)。编写一个简单的控制台应用程序进行测试。
  • 通过附加到进程进行调试。
  • 使用控制台/服务混合方法(很棒的技术,我用来实时流出调试消息)。