如何将topshelf集成到现有的Windows服务项目中?

时间:2018-05-01 06:50:54

标签: c# visual-studio windows-services topshelf

我希望能够在Visual Studio中使用我的服务的TopShelf调试功能。

很多examplesdocumentation指的是在Visual Studio中创建Windows控制台项目第一个,然后然后添加TopShelf ,OWIN等

但是,在我的情况下,我已经拥有了一个非常好且工作正常的Windows服务项目,名为QShipsService.sln等...它使用了一个简单的连接服务(不可否认的是旧的SOAP遗留服务)。

有人可以指导我或提供一个如何使用TopShelf的示例,以及现有的非控制台项目吗?

1 个答案:

答案 0 :(得分:1)

我找到了自己的解决方案......

我做的假设是默认的Windows服务项目默认为希望将程序注册为服务,并在服务运行后启动OnOpen()OnClose()方法。

在我的情况下,我想重新使用基于Timer()的现有服务,并且它将每4小时启动一次以调用SOAP调用并返回一些数据。我没有意识到的是ServiceConfigurator试图调用自己的Open()Close()方法。

所以我评论了OnOpenOnClose方法并允许配置程序通过Open()方法调用我的工作进程,这是我本来打算第一次做的!

对于像我这样的新手,这里是代码......

//using System.ServiceProcess;
using Topshelf;

namespace QShipsService
{
    static class Program
    {
        static void Main(string[] args)
        {
            HostFactory.Run(
                configure =>
                {
                    configure.Service<QShipsService.QshipsService>(
                        service =>
                        {
                            service.ConstructUsing(s => new QShipsService.QshipsService());
                            service.WhenStarted(s => s.QStart());
                            service.WhenStopped(s => s.QStop());
                        });

                    //Setup Account that window service use to run.
                    configure.RunAsLocalSystem();

                    //add details and names about the service
                    configure.SetServiceName("QshipsService");
                    configure.SetDisplayName("QshipsService");
                    configure.SetDescription("QshipsService Windows Service to extract data from the QSHIPS SOAP service. Data is recorded and maintained inside the SPOT's database in POT-DB.");
                });


            //## USE THIS IF WE'RE NOT USING TOPSHELF !! ##
            //    //this loads and starts the QshipsService (see QshipsService.cs program)
            //    ServiceBase[] ServicesToRun;
            //    ServicesToRun = new ServiceBase[]
            //    {
            //        new QShipsService.QshipsService()
            //    };
            //    ServiceBase.Run(ServicesToRun);
        }
    }
}