我想创建一个可以访问我的数据库的Windows服务。我的数据库是SQL Server 2005。
实际上我正在网站上工作,我的数据库在我们的服务器内。我需要每秒访问我的数据库并更新记录。为此,我需要制作一个将安装到我们的服务器并执行任务的Windows服务。
我一直在从本地计算机访问数据库然后运行该服务,但问题是我不确定如何测试此服务。
我尝试安装到我的本地计算机上。它安装然后我运行了服务,但它没有执行任务,我认为服务无法连接数据库。
服务及其安装程序没有问题。唯一的问题是如何测试我的Windows服务。
答案 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
并且具有OnStart
和OnStop
,请添加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)
我认为每个人都提供了很多很棒的答案。这将是我调试此问题的有序方法: