我想将我拥有的程序转换为服务,以便我可以在不记录的情况下使用它。基本上它的作用是使用SSH将指定的文件夹备份到指定的位置。然而,我遇到的问题是我不知道如何告诉它这些项目。我只知道如何使用带参数的整数来启动,停止和运行自定义命令。
我该怎么做?
Windows服务,而非Web服务
编辑:它备份的文件夹不会保持一致,并会在每个运行时更新
答案 0 :(得分:6)
您可以使用ServiceController类实例化您的服务并传递命令行参数。
using (ServiceController serviceController = new ServiceController(serviceName))
{
string[] args = new string[1];
args[0] = "arg1";
serviceController.Start(args);
}
当Windows启动服务时,“arg1”将作为main()中的常规命令行参数提供。
答案 1 :(得分:2)
我看到你(或某人)投票给Sebastian Sedlak的答案,因为他提到在Windows服务中托管WCF服务。你的回复是
It's in nice bold lettering in the question. Not a Web Service, therefor WCF is out of the question
我认为你误解了他的意思。他不是在谈论 Web服务。他说的是在 Windows服务中托管 WCF服务 。
这远不是同一件事。您可以在任何Windows(窗体/控制台/服务)应用程序中托管WCF服务。这样做的一点是,应用程序可以通过其内部WCF服务以相同的方式进行通信,因为您可以与Web服务进行通信(您可以还在IIS中托管WCF服务,顺便说一下,然后将它们变成“Web服务”,就像你似乎指的那样。)
在Windows服务中,这意味着您可以向其发送任何命令,并在其运行时从中获取您想要的任何信息。
事实上,我正在开发一个项目,这是一个Windows服务,我需要能够在运行时联系并传递命令并从中获取信息。例如,我希望能够告诉它在哪里存储某些东西,记录什么,重置/重启 - 以及轮询状态消息。我通过在Windows服务中托管WCF服务来实现此目的。该WCF服务公开了一组方法,在我的例子中包括接收命令和返回状态信息。因此,当 Windows服务运行时,我可以通过其内置的 WCF服务与其联系(甚至远程),并告诉它该做什么。
这是一个非常容易实现的东西,在Windows服务的情况下,可以为您提供比通过基本标准命令更丰富的服务接口。
但是,您指定希望Windows服务每次启动时都能接收其文件夹设置,这使得这种被动设置不太理想(因为它无法实现)做任何事情,直到你传递正确的文件夹)。
处理此问题的一种方法(使用托管的WCF服务)将使Windows服务始终 (即自动启动)。它的默认状态是空闲的。然后你可以发出一个“开始处理”命令,为它提供正确的文件夹(通过调用相应的WCF服务方法)。同样,WCF服务将公开方法,为您提供应用程序的状态(当前文件夹,进度,忙/空闲等)。处理完成后,它将返回空闲状态,等待下一组文件夹提供给它。
这样做可以很容易地进行远程控制 - 您甚至可以为其创建一个在线管理面板,可以从任何地方访问。
答案 2 :(得分:2)
问题在于,虽然传入参数并不困难,但当机器重新启动并且Windows尝试重新启动服务时,那些参数不存在。它们仅在有人从命令行启动服务时才存在。
例如,。我有一个承载WCF服务的Windows服务。我希望用户能够指定要监听的WCF服务的非默认端口号。他们通过启动Windows服务来实现这一点...... MyService -port:xxxxx
哪个工作正常,直到服务器重新启动,然后Windows重启MyService(但没有参数),wcf服务默认为原始端口#
答案 3 :(得分:1)
是否可以使用配置文件来指定这些项目?
答案 4 :(得分:1)
将服务的启动参数存储在注册表中:然后,当注册表启动时,它应该从注册表中读取其启动参数。
答案 5 :(得分:1)
任何服务都能够在启动时接收命令行参数。
答案 6 :(得分:1)
Windows服务具有与其他服务器类似的可执行文件。我相信您可以编写它来接受命令行参数并在Windows服务配置中指定这些参数。您也可以让它读取配置文件。如果您使用的是.NET,那么框架中就会有配置文件类。
答案 7 :(得分:1)
为什么不在Windows服务中托管WCF服务以获取此类“管理”功能? (也可以进行远程处理)
答案 8 :(得分:1)
RE:配置文件。
当然可以使用配置文件。 并且可以在服务运行时更改文件。
如果配置文件实际上发生了变化,这将是一个很好的解决方案。 我的所有服务都使用XML配置文件,包含在类中以便于重用。
包装器有一个选项,可以使用fileMonitor监视XML文件的更改,可选择自动刷新配置文件的内容,最后将一个事件引发到服务类。 然后,该服务可以根据需要“重置”自身,以将新值合并到XML配置文件中。
将配置放入注册表有一些问题:
XML文件易于复制,编辑,共享,查看和理解。 抛出一些好的COMMENT块和一个详细的XSD文件,它也成为了很好的文档资源。
查看XPath,以便在XML文件中轻松导航和提取值。
$ 0.02 ......大卫......
答案 9 :(得分:0)
查看此博客:http://bipinkarms.com/wp/?p=79 博客说明了传递参数的几种方法。
答案 10 :(得分:0)
关于app.config文件 - 我很确定你的服务会读取并使用这些文件,因为我用这种方式编写了所有的windows-services;) 因此,只需将app.config中所需的一切放在“application”(非用户)下,然后将“yourname.exe.config”编辑到“InstallUtil”服务所在的文件夹中。