testingWindows服务的问题

我想做一个Windows服务,将访问我的数据库。 我的数据库是SQL Server 2005。

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

我一直在从本地机器访问数据库,然后运行服务,但问题是我不知道如何testing此服务。

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

服务和安装程序没有问题。 唯一的问题是如何testing我的Windows服务。

Solutions Collecting From Web of "testingWindows服务的问题"

您可以将Visual Studio解决方案附加到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继承而来的具有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方法中放置一个断点RunConsole

使用记录器报告错误!

尝试抓住每一个可能的错误,并把它们记录在一个文件中,并/或者发送一封电子邮件:记住“没有人听到服务正在死亡”!

Log4Net有记录器来处理滚动文件,数据库持久性,甚至SMTP邮件。 例如,请参阅: http : //logging.apache.org/log4net/release/config-examples.html您可能会经常检查日志文件是否有错误。 为了避免这种烦扰,我经常使用SMTP appender。

干杯,B

marc_s的答案是完美的,但是事实上,服务的主线程不会按照预期等待用户输入。 我想这就是为什么他会陷入无限循环。

从Igal Serban创建控制台的代码借用,下面是对暂停的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运行。 (你将需要使你的服务方法等公开,并创建你的服务的立场)

我想每个人都提供了很多很好的答案。 这将是我有序的方法来调试这个问题:

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