传递Windows服务参数以使其执行操作

时间:2009-01-19 18:46:07

标签: c# .net parameters service

我想将我拥有的程序转换为服务,以便我可以在不记录的情况下使用它。基本上它的作用是使用SSH将指定的文件夹备份到指定的位置。然而,我遇到的问题是我不知道如何告诉它这些项目。我只知道如何使用带参数的整数来启动,停止和运行自定义命令。

我该怎么做?

Windows服务,而非Web服务

编辑:它备份的文件夹不会保持一致,并会在每个运行时更新

11 个答案:

答案 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”服务所在的文件夹中。